home *** CD-ROM | disk | FTP | other *** search
/ Aminet 8 / Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso / Aminet / util / rexx / Scion2html.lha / Scion2html.rexx next >
OS/2 REXX Batch file  |  1995-08-12  |  70KB  |  1,956 lines

  1. /* © Harold H. Ipolyi        11 June 1994, 1995
  2.  
  3.  Install: just drag the Scion2html.rexx & its ICON into REXX:
  4.  
  5. ==================================README=====================================
  6. Short:    Genealogy html's from Scion data bases
  7. Uploader: ipolyi@pat.mdc.com (Harold H. Ipolyi)
  8. Author:   Harold H. Ipolyi
  9. Type:     util/rexx
  10. LastRev:  12 Aug 1995
  11.  
  12.  Scion2html.rexx can repeatedly and painlessly recreate html files from
  13.  entries in Scion data bases for cross-platform viewing via Mosaic, etc.
  14.  
  15.  Scion Genealogist by Rob Akins (biz/dbase/Scion407.lha) provides Arexx
  16.  ports for extracting data.
  17.  
  18.  GfxCon by Dirk Farin (gfx/conv/gfxcon.lha) is used to make Thumbnails
  19.  from Scion data base pictures as links to Picture Albums
  20. _____________________________________________________________________________
  21.  
  22. IMPORTANT: replaces defunct script "ScionToMosaic.rexx"
  23.  
  24. ==================================README=====================================
  25.  
  26.      PICTURES from [P|F]P{IRN}.DBNAME are links to Picture Albums ( ® )
  27.                   (please see PP & FP Notes)
  28.  
  29. Prerequisites: ScionGenealogist V 4.07 (or greater) by Rob Akins
  30.                ARexx (of course :)
  31.                rexxsupport.library
  32.                rexxarplib.library
  33.                html viewer (AMosaic, Mosaic, NetScape, ... )
  34.  
  35.          also:       (to incorporate and display pictures)
  36.                GfxCon V1.6 (or greater) by Dirk Farin ( » Sys:Tools)
  37.                Amiga OS 3.0 (or greater) for picture datatypes
  38.  
  39. TESTED:        on Amiga3000 Kickstart v.37.175 Workbench v.38.35
  40.         &  Amiga3000 Kickstart v.40.68  Workbench v.40.42
  41.         w/ ScionGenealogist V 3.06 & Mosaic1.2NoNet
  42.         w/ ScionGenealogist V 3.13 & Mosaic1.3betaAmitcp
  43.         w/ ScionGenealogist V 4.07 & Mosaic1.4betaAmitcp
  44.  
  45.         html file compatibility tested on: AMosaic,
  46.                 NCSA Mosaic (Sun), Netscape (Sun), Netscape (Mac)
  47.  
  48. Bugs:           If a new Thumbnail format is selected, the user must
  49.                 manually edit the Picture Album files to reflect the
  50.                 new Thumbnail suffixes.     (It is assumed that the
  51.                 Picture Album files may have been user modified and
  52.                 therefore should be protected against regeneration)
  53.  
  54. Release History:
  55.  
  56.  11 Jun 1994 · ScionToMosaic.rexx for ScionGenealogist V 3.06
  57.  
  58.  19 Jun 1994 · MakeDir(Gdir) fixed; extra comments processed.
  59.  
  60.  25 Jun 1994 · Fixed descenders; Women in List italicised
  61.              · updated for ScionGenealogist V 3.13
  62.  
  63.   3 Sep 1994 · Replace occurrences of "<ScionIRN>" by NAMES from DB
  64.              · e.g. Replace <101> by Iam Onehundredone, Jr.
  65.              · Added Family Info file processing; Ancestor trees
  66.              · Added descendant charts
  67.              · Women italicised; men boldface everywhere
  68.              · Added creation of a textual file "GenealogyOf..."
  69.  
  70.   1 Mar 1995 · cleaned up bugs in creation of textual files
  71.  
  72.   6 Jun 1995 · renamed ScionToMosaic to Scion2html
  73.              ·   (somehow it kept winding up in "music" on AmiNet)
  74.              · date format in "ancestors" section normalized
  75.              · images used as links to picture albums (see
  76.              ·  PP & FP Notes) and links to pictures
  77.              · GfxCon >V1.5 used for picture copying and reducing
  78.              · recoded for DOS/Windows restricted 8.3 file names
  79.  
  80.  26 Jun 1995 · A little comments cleanup after the last changes
  81.              · skip remaking of files when unnecessary
  82.              · another new wrinkle for one of the users:
  83.              ·     special file name prefixes     ( remember to  )
  84.              ·        look for and change:        ( change names )
  85.              ·     PersonPrefix & FamilyPrefix    ( of albums to )
  86.              ·      definitions ( if desired )    ( conform...   )
  87.  
  88.   1 Jul 1995 · added graphics to Ancestors charts
  89.              · allow family picture album sans family info file
  90.              · Thumbnail size now user settable ( at line 3 )
  91.  
  92.   5 Jul 1995 · (more info) » ( ¶ )
  93.              · (family info) » ( ¶ )
  94.              · (Picture Album) » ( ® )
  95.              · (¶) (®) glyphs added to Ancestor, Descendant charts
  96.              · Thumbnail format {GIF|JPEG} now user settable
  97.              ·  ( suffix still .gif in all cases )
  98.  
  99.   1 Aug 1995 · updated for ScionGenealogist V 4.07
  100.              · set correct stack size (21000) for GfxCon
  101.              · JPEG now the default Thumbnail format
  102.              ·     (smaller files, no © problems, looks better)
  103.              · changing of configuration added
  104.              · configuration now saved in S:
  105.  
  106.  12 Aug 1995 · fix some bugs that creeped in with updated to Scion4.07
  107.              · handling of more of the new ScionV4.07 data fields
  108.              · using CheckForReplacement to create all anchors
  109.              · changed appearance of family & descendant charts
  110.              · configuration is displayed at startup
  111.              · 
  112.  
  113.  (: "uudecode Scion2html.rexx" <- extracts an interesting Genealogy :)
  114.  (:  hint: compare the names of the GreatGrandParents on both sides :)
  115.  
  116.    ( start a shell                  )
  117.    ( cd [some work directory]       )
  118.    ( uudecode Rexx:Scion2html.rexx  ) whatever uudecode equiv you use
  119.    ( run Scion Samms                )
  120.    ( rx Scion2html.rexx Normal      ) back on WB screen
  121.  
  122.  « the following can be safely left here »
  123.  
  124. begin 755 Samms
  125. M4V-I;VX`-"XP,```3@``%``)```@0P5%9&ET``56:65W``9!1$%-4P`%0T%)U
  126. M3@`%04U%4P`*JU5.2TY/5TZ[``E/3$U35$5!1``&4T%-35,``0`!``(@``(@(
  127. M``(@``(@``(@```!``$!``D&4T%-35,`!U9I<F=I;``"30`!``$``0`6(D9IF
  128. M<G-T($QE;G-M86X@4V%M;7,B``$`*BAD97-C96YD960@9G)O;2!O;FQY(#0@F
  129. M1W)E871'<F%N9%!A<F5N=',I`#A3;VQA<FEA;B!#;W5N8VEL;&]R('P@4')ES
  130. M<VED96YT(&]F('1H92!'86QA8W1I8R!#;W5N8VEL`#]A;&UO<W0M='=I;B!O/
  131. M9B!T=VEN<R`\-CX@)B`\-SXL(&AI<R`B<75A9')U<&QE('-E8V]N9"!C;W5S]
  132. M:6YS(@``````+D-H+C@@;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N($4N(%-M[
  133. M:71H+"!0:"Y$+@`!``$``0`!``$```(``P$``09304U-4P`02F%M97,@06QEN
  134. M>&%N9&5R``)-``$``0`!``$``0`!``$`&V]N;'D@8VAI;&0@;V8@/#@^(&%N/
  135. M9"`\,30^```````N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@12X@12X@R
  136. M4VUI=&@L(%!H+D0N``$``0`!``$``0```P`%`0`!"4],35-414%$``9387)AG
  137. M:``"1@`!``$``0`!``$``0`!`!QO;FQY(&-H:6QD(&]F(#PQ,CX@86YD(#PQ+
  138. M,#X``````"Y#:"XX(&]F(")&:7)S="!,96YS;6%N(B!B>2!%+B!%+B!3;6ET:
  139. M:"P@4&@N1"X``0`!``$``0`!```$``8!``()3TQ-4U1%040`!4IO:&X``DT`C
  140. M`0`!``$``0`!``$``0`<;VYL>2!C:&EL9"!O9B`\,3,^(&%N9"`\,3$^````+
  141. M```N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@12X@12X@4VUI=&@L(%!H8
  142. M+D0N``$``0`!``$``0``!0`$`0`"!E-!34U3``9)<F5N90`"1@`!``$``0`!]
  143. M``$``0`!`!MO;FQY(&-H:6QD(&]F(#PY/B!A;F0@/#$U/@``````+D-H+C@@^
  144. M;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N($4N(%-M:71H+"!0:"Y$+@`!``$`;
  145. M`0`!``$```8``@`)3TQ-4U1%040`!T=E;W)G90`"30`!``$``0`!``$``0`!C
  146. M`#94=VEN(&)R;W1H97(@;V8@/#<^.R`B<75A9')U<&QE('-E8V]N9"!C;W5SZ
  147. M:6XB(&]F(#PQ/@``````+D-H+C@@;V8@(D9I<G-T($QE;G-M86XB(&)Y($4N5
  148. M($4N(%-M:71H+"!0:"Y$+@`!``$``0`!``$```<``@`)3TQ-4U1%040`!%)A#
  149. M>0`"30`!``$``0`!``$``0`!`#94=VEN(&)R;W1H97(@;V8@/#8^.R`B<75A&
  150. M9')U<&QE('-E8V]N9"!C;W5S:6XB(&]F(#PQ/@``````+D-H+C@@;V8@(D9I@
  151. M<G-T($QE;G-M86XB(&)Y($4N($4N(%-M:71H+"!0:"Y$+@`!``$``0`!``$`8
  152. M``@`!P$``P9304U-4P`%0FEL;``"30`!``$``0`!``$``0`!`#-4=VEN(&)R!
  153. M;W1H97(@;V8@/#D^+"!S:7-T97)S(#PQ,#X@)B`\,3$^(&%R92!T=VEN<P``M
  154. M````&"AN;R!F:7)S="!N86UE(&EN(&)O;VLI``$``0`!``$``0``"0`'`0`$K
  155. M!E-!34U3``57:6QL``)-``$``0`!``$``0`!``$`,U1W:6X@8G)O=&AE<B!OT
  156. M9B`\.#XL('-I<W1E<G,@/#$P/B`F(#PQ,3X@87)E('1W:6YS```````8*&YO8
  157. M(&9I<G-T(&YA;64@:6X@8F]O:RD``0`!``$``0`!```*``<!``4&4T%-35,`7
  158. M!4=I;&P``D8``0`!``$``0`!``$``0`R5'=I;B!S:7-T97(@;V8@/#$Q/BP@G
  159. M8G)O=&AE<G,@/#@^("8@/#D^(&%R92!T=VEN<P``````&"AN;R!F:7)S="!NT
  160. M86UE(&EN(&)O;VLI``$``0`!``$``0``"P`'`0`&!E-!34U3``5*:6QL``)&;
  161. M``$``0`!``$``0`!``$`,E1W:6X@<VES=&5R(&]F(#PQ,#XL(&)R;W1H97)SZ
  162. M(#PX/B`F(#PY/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!BW
  163. M;V]K*0`!``$``0`!``$```P`"`$`!0E/3$U35$5!1``%2F%C:P`"30`!``$`"
  164. M`0`!``$``0`!`#14=VEN(&)R;W1H97(@;V8@/#$S/BP@<VES=&5R<R`\,30^\
  165. M("8@/#$U/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!B;V]K;
  166. M*0`!``$``0`!``$```T`"`$`!@E/3$U35$5!1``%36%C:P`"30`!``$``0`!`
  167. M``$``0`!`#14=VEN(&)R;W1H97(@;V8@/#$R/BP@<VES=&5R<R`\,30^("8@?
  168. M/#$U/B!A<F4@='=I;G,``````!@H;F\@9FER<W0@;F%M92!I;B!B;V]K*0`!?
  169. M``$``0`!``$```X`"`$``PE/3$U35$5!1``$1F%Y``)&``$``0`!``$``0`!R
  170. M``$`-%1W:6X@<VES=&5R(&]F(#PQ-3XL(&)R;W1H97)S(#PQ,CX@)B`\,3,^\
  171. M(&%R92!T=VEN<P``````&"AN;R!F:7)S="!N86UE(&EN(&)O;VLI``$``0`!!
  172. M``$``0``#P`(`0`$"4],35-414%$``1-87D``D8``0`!``$``0`!``$``0`TN
  173. M5'=I;B!S:7-T97(@;V8@/#$T/BP@8G)O=&AE<G,@/#$R/B`F(#PQ,SX@87)E>
  174. M('1W:6YS```````8*&YO(&9I<G-T(&YA;64@:6X@8F]O:RD``0`!``$``0`!K
  175. M```0```!``<&4T%-35,`!T%L8F5R=``"30`!``$``0`!``$``0`!``$`````7
  176. M`"Y#:"XX(&]F(")&:7)S="!,96YS;6%N(B!B>2!%+B!%+B!3;6ET:"P@4&@N&
  177. M1"X``0`!``$``0`!```1```!``@)3TQ-4U1%040`"$-H97-T97(``DT``0`!:
  178. M``$``0`!``$``0`!```````N0V@N."!O9B`B1FER<W0@3&5N<VUA;B(@8GD@O
  179. M12X@12X@4VUI=&@L(%!H+D0N``$``0`!``$``0``$@```0`'!D%$04U3``=!B
  180. M9&5L;&4``D8``0`!``$``0`!``$``0`!```````4*&YO="!N86UE9"!I;B!B!
  181. M;V]K*0`!``$``0`!``$``!,```$`"`5#04E.``A#86UI;&QE``)&``$``0`!]
  182. M``$``0`!``$``0``````%"AN;W0@;F%M960@:6X@8F]O:RD``0`!``$``0`!G
  183. M```4``D`!E-!34U3``E6:7)G:6QI80`"1@`!``$``0`!``$``0`!``$`````T
  184. M``$``0`!``$``0`!```!``(``P$``0$``0`!``$```````$``0`!``$``0``7
  185. M`0```@`$``4"``8`!P$``0`!``$```````$``0`!``$``0```0```P`(``X!_
  186. M``(!``$``0`!```````!``$``0`!``$```$```0`"0`/`0`%`0`!``$``0``R
  187. M`````0`!``$``0`!```!```%``P`"@$``P$``0`!``$```````$``0`!``$`M
  188. M`0```0``!@`-``L!``0!``$``0`!```````!``$``0`!``$```$```<`$``28
  189. M!``(``D`"@`+`0`!``$``0```````0`!``$``0`!```!```(`!$`$P0`#``-]
  190. M``X`#P$``0`!``$```````$``0`!``$``0```0``"0`!```!`!0!``$``0`!*
  191. 2```````!``$``0`!``$```$`&
  192. ``
  193. end
  194. size 2988
  195.  
  196.   -----------------------------------------------------------------
  197.  | Conventions that I followed in my ScionGenealogist data base:   |
  198.  |                                                                 |
  199.  | ·  lastnames kept pure (no honorifics, Jr's, III's )            |
  200.  |                                                                 |
  201.  | ·  given names have any and all honorifics AFTER a COMMA        |
  202.  |                                                                 |
  203.  |  for example:  LastName      FirstNames, honorifics             |
  204.  |                                                                 |
  205.  |                BAUER-GAUSS   Joseph, Dr.                        |
  206.  |                DAGLEY        Richard Kelley, Jr.                |
  207.  |                                                                 |
  208.  |-----------------------------------------------------------------|
  209.  |                                                                 |
  210.  |  For a name change (NOT maidenname > marriedname), try this:    |
  211.  |                New           Birth Name > Changed To, Ph. D.    |
  212.  |     which lists as: Birth Name > Changed To New, Ph. D.         |
  213.  |                                                                 |
  214.   -----------------------------------------------------------------
  215. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  216. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  217. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  218. »«                                                                »«
  219. «» GetLastName: PROCEDURE at end of script capitalizes Last Names »«
  220. «» -------------------------------------------------------------  «»
  221. »« | it can also be used to handle "non-conforming" Last Names |  »«
  222. «» |                e.g. "MAC ISAAC" --> "MacISAAC"            |  «»
  223. »« |                     "VON NUEMANN" --> "VonNuemann"        |  »«
  224. «» -------------------------------------------------------------  «»
  225. »« BUT: you must add the additional tests yourself (it's easy!)   »«
  226. «»                                                                «»
  227. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  228. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  229. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  230.  |-----------------------------------------------------------------|
  231.  |                                                                 |
  232.  | · if Death Date is blank; Death Place can be a COMMENT field    |
  233.  |                                            e.g. Phone #         |
  234.  | · if Burial Date is blank; Burial Place can be a COMMENT field  |
  235.  |                                            e.g. Address         |
  236.   -----------------------------------------------------------------
  237.  
  238.  * Run 'rx Scion2html.rexx' for further directions or double-click
  239.  
  240.  * 'rx Scion2html.rexx Normal' automagically [re]creates a .htm file for
  241.  * each person in your ScionGenealogist data base; following the TEMPLATE:
  242.  
  243. ############# begin genealogytemplate.html ####################################
  244. <TITLE>Person Data Sheet</TITLE>
  245. <PRE><TT>
  246. <A href="Person#a.html"><img src="Person#I.jpg"></A>
  247. <B>Person</B> (<A HREF="Person#I.html"> ¶ </A>) (<A href="Person#a.html"><B> ® </B></A>) (<A href="Genealogy/GenealogyFile.html"><B>List of Persons.</B></A>)
  248. Born: birthdate * birthplace <BR>
  249. Died: deathdate + deathplace . Buried: burialplace <BR>
  250. <HR>
  251. <H2>List of Persons in data base.</H2><P>
  252. <A HREF="Person#.html"><B>malePerson</B></A> * birthdate + deathdate <A HREF="Father.html"><B>Father</B></A>_&_<A HREF="Mother.html"><I>Mother</I></A><BR>
  253. <A HREF="Person#.html"><I>femalePerson</I></A> * birthdate + deathdate <A HREF="Father.html"><B>Father</B></A>_&_<A HREF="Mother.html"><I>Mother</I></A><BR>
  254. <HR>
  255. <H3>Immediate Family of <I>Person</I></H3> ( Parents, Siblings, Spouse, and Children )
  256.   <A HREF="Father.html"><B>Father</B></A>_&_<A HREF="Mother.html"><I>Mother</I></A> & mdate @ mplace
  257.   |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  258.   |_____ <A HREF="sibling1.html">sibling1</A> * sibling1birthdate + sibling1deathdate
  259.   |_____ <A HREF="siblingN.html">siblingN</A> * siblingNbirthdate + siblingNdeathdate
  260.   |             
  261.   <b>Person</b>_&_<A HREF="Spouse1.html"><I>Spouse1</I></A> & m1date @ m1place
  262.   |  |  |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  263.   |  |  |_____ <A HREF="m1child1.html"><I>m1child1</I></A> * m1child1birthdate + m1child1birthdate
  264.   |  |  |_____ <A HREF="m1childN.html"><B>m1childN</B></A> * m1childNbirthdate + m1childNbirthdate
  265.   |  |
  266.   |  |_&_<A HREF="Spouse2.html"><I>Spouse2</I></A> & m2date @ m2place
  267.   |    |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  268.   |    |_____ <A HREF="m2child1.html"><B>m2child1</B></A> * m2child1birthdate + m2child1birthdate
  269.   |    |_____ <A HREF="m2childN.html"><I>m2childN</I></A> * m2childNbirthdate + m2child2birthdate
  270.   |
  271.   |_&_<A HREF="Spousen.html"><I>Spousen</I></A> & mNdate @ mNplace
  272.     |            (<A HREF="Family#I.html"> ¶ </A>) (<A href="Family#a.html"><B> ® </B></A>)
  273.     |_____ <A HREF="mNchild1.html"><I>mNchild1</I></A> * mNchild1birthdate + mNchild1birthdate
  274.     |_____ <A HREF="mNchildN.html"><I>mNchildN</I></A> * mNchildNbirthdate + mNchildNbirthdate
  275. <HR>
  276. Ancestors
  277.           - <A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (FFF) * birthdate + deathdate
  278.       - <A HREF="GrandFather.html"><B>GrandFather</B></A> (FF) * birthdate + deathdate
  279.           - <A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (FFM) * birthdate + deathdate
  280.   - <A HREF="Father.html"><B>Father</B></A> (F) * birthdate + deathdate
  281.           - <A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (FMF) * birthdate + deathdate
  282.       - <A HREF="GrandMother.html"><I>GrandMother</I></A> (FM) * birthdate + deathdate
  283.           - <A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (FMM) * birthdate + deathdate
  284. Person * birthdate + deathdate
  285.           - <A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (MFF) * birthdate + deathdate
  286.       - <A HREF="GrandFather.html"><B>GrandFather</B></A> (MF) * birthdate + deathdate
  287.           - <A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (MFM) * birthdate + deathdate
  288.   - <A HREF="Mother.html"><I>Mother</I></A> (M) * birthdate + deathdate
  289.           - <A HREF="GreatGrandFather.html"><B>GreatGrandFather</B></A> (MMF) * birthdate + deathdate
  290.       - <A HREF="GrandMother.html"><I>GrandMother</I></A> (MM) * birthdate + deathdate
  291.           - <A HREF="GreatGrandMother.html"><I>GreatGrandMother</I></A> (MMM) * birthdate + deathdate
  292. <HR>
  293. &Marriages and |_Descendants
  294.   <B>Person</B> * birthdate
  295.   &_<A HREF="Spouse1.html"><I>Spouse1</I></A> * birthdate
  296.    | <A HREF="m1child1.html"><I><B>m1child1</B></I></A> * m1child1birthdate
  297.    | <A HREF="m1child.html"><B><B>m1childN</B></B></A> * m1childNbirthdate
  298.   &_<A HREF="Spouse2.html"><I>Spouse2</I></A> * birthdate
  299.    | <A HREF="m2child1.html"><B>m2child1</B></A> * m2child1birthdate
  300.    | <A HREF="m2childN.html"><I>m2childN</I></A> * m2childNbirthdate
  301.    | &_<A HREF="m2childNSpouse1.html"><I>m2childNSpouse1</I></A>
  302.    |  | <A HREF="m2childNchild1.html"><B>m2childNchild1</B></A>
  303.   &_<A HREF="Spousen.html"><I>Spousen</I></A> * birthdate
  304.    | <A HREF="mNchild1.html"><I>mNchild1</I></A> * mNchild1birthdate
  305.    | <A HREF="mNchildN.html"><I>mNchildN</I></A> * mNchildNbirthdate
  306. <HR>
  307.      a template to represent Genealogy data in HTML hypertext.
  308.  * replace all ocurrences of each appropriate ITEM with ACTUAL DATA
  309.      e.g. search-replace-all Person with: My Name
  310.      e.g. query-search-replace Mother with: My Mother's Name
  311.  * judiciously edit .htm file names in anchors
  312.  * add/remove lines for children, siblings, spouses as necessary
  313. </TT></PRE>
  314. </HTML>
  315. ############### end genealogytemplate.html ###################################
  316.  
  317.  * In an HTML file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:
  318.  
  319.  * ( see the hint at the end of a NORMAL run or specify ANCHOR )
  320. _____________________________________________________________________________
  321.  
  322.  * The PN{IRN}.DBNAME files are used to generate the " ¶ " files.
  323.  
  324.  * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding
  325.  * " ¶ " file will be updated if 'rx Scion2html.rexx {IRN}' is re-run.
  326.  
  327.  * PP & FP Notes: (personal & family pictures; picture albums " ® ")
  328.  * ScionGenealogist names pictures as;
  329.  *      PP{IRN}.DBNAME (personal) and FP{mFGRN}.DBNAME (family)
  330.  * {P|F}P{IRN|mFGRN}.DBNAME now used as pictures & links.
  331.  *    GfxCon is used to copy/reduce jpegs from {P|F}P{IRN|mFGRN}.DBNAME
  332.  *    reductions are anchors pointing to html's for pictures albums
  333.  *    reductions in pictures albums are anchors pointing to pictures
  334.  *  picture albums will not be overwritten; they may be updated with
  335.  *    additional pictures; links to other pictures, etc.
  336.  
  337.  * Whenever picture {P|F}P{IRN|mFGRN}.DBNAME is changed or replaced,
  338.  *  the corresponding images will be updated
  339.  
  340.  * {P|F}P{IRN|mFGRN}.DBNAME may be any legal GfxCon input picture FORMAT:
  341.  * (ILBM,RGB8,PCX,BMP,RLE8,TIFF,Targa,LBM,RGBN,IMG,RLE4,GIF,JPEG,RGB-Raw)
  342. */
  343.  
  344.             /*   some Intitializations = default    */
  345.  Thumbnail = 350    /* Thumbnail maximum dimension        */
  346.  Thumbformat = "JPEG"    /* Thumbnail format { GIF | JPEG }    */
  347.  MakeText = 0        /* 1 to also make printable text file    */
  348.  GeneralPrefix = ""    /* needs only be set for specific circumstances 
  349.              ( if this makes no sense, you don't need it :) */
  350.  
  351. say ' '
  352. GoodScion2html = Open('Scion2html','S:Scion2html.Config','r')
  353. if GoodScion2html then do
  354.  Mdir = readln('Scion2html')
  355.  Thumbnail = readln('Scion2html')
  356.  Thumbformat = readln('Scion2html')
  357.  MakeText = readln('Scion2html')
  358.  GeneralPrefix = readln('Scion2html')
  359.  Close('Scion2html')
  360.  say ' S:Scion2html.Config settings:'
  361.  say '  output destination: 'Mdir
  362.  say '  Thumbnail: 'Thumbformat' max 'Thumbnail'x'Thumbnail
  363.  if GeneralPrefix ~= '' then say '  GeneralPrefix = 'GeneralPrefix
  364.   else say '  GeneralPrefix = {default}'
  365.  if MakeText then say ' also make a printable file'
  366.   else say '  skip making printable files'
  367.  say ' '
  368.  end
  369. else do
  370.  say '   default settings:'
  371.  say '  output destination: TBS (to be supplied)'
  372.  say '  Thumbnail: 'Thumbformat' max 'Thumbnail'x'Thumbnail
  373.  if GeneralPrefix ~= '' then say '  GeneralPrefix = 'GeneralPrefix
  374.   else say '  GeneralPrefix = {default}'
  375.  if MakeText then say ' also make a printable file'
  376.   else say '  skip making printable files'
  377.  say ' '
  378.  end
  379.  
  380. if GeneralPrefix = "" then GeneralPrefix = "GENEAFI"
  381.  
  382. /* add libraries */
  383. libs = 'rexxsupport.library rexxarplib.library'
  384. DO i = 1 TO Words(libs)
  385.  lib = Word(libs,i)
  386.  if ~Show('Lib',lib) then do
  387.   if EXISTS('LIBS:'lib) then call addlib lib, 0, -30
  388.   else do
  389.    'message "ERROR: cannot find' lib 'in LIBS:"'
  390.    AskExit()
  391.    end
  392.   end
  393.  end i
  394.  
  395. Address "SCIONGEN"    /* Point at Scion Genealogist port */
  396. options RESULTS
  397.  
  398. if Show(p,'SCIONGEN') then do
  399.  'GETDBNAME'     /* Issue GET DB NAME command to Scion Genealogist */
  400.  DBNAME = RESULT
  401.  'GETTOTALIRN'
  402.  TOTALIRN = RESULT
  403.  if TOTALIRN = 0 then do
  404.  SAY '                                                                  '
  405.  SAY '   Scion Genealogist is currently displaying an EMPTY data base!  '
  406.  SAY '                                                                  '
  407.  SAY ' '
  408.  AskExit()
  409.   end
  410.  end
  411.  
  412. else do
  413.  SAY '                                                               '
  414.  SAY '   Scion Genealogist is NOT currently displaying a data base:  '
  415.  SAY '                                                               '
  416.  SAY ' Please start Scion; load desired data base; then try again... '
  417.  SAY '                                                               '
  418.  SAY ' '
  419.  AskExit()
  420.  end
  421.  
  422. PARSE ARG target
  423. target = Upper(strip(target,,'"')) /* just in case, remove errant quotes */
  424.  
  425. origThumbnail = Thumbnail
  426. origThumbformat = Thumbformat
  427.  
  428. blanks = '                                                        '
  429.  
  430. DoPictures = CheckGfxCon()
  431.  
  432. DO WHILE target = '' | target = '?' | target = '/'
  433.  SAY ' '
  434.  if target = '?' | target = '/' then do
  435.   SAY ' please send comments, questions to: ipolyi@pat.mdc.com'
  436.   SAY '                                    or:'
  437.   SAY '             Scion2html.rexx  ©  Harold H. Ipolyi '
  438.   SAY '                                  P.O.Box 891206 '
  439.   SAY '                                  Houston, Tx 77289-1206'
  440.   SAY '  ____________________________________________________________'
  441.   SAY ' /                                                            \'
  442.   SAY '< to [re]create html hypertext from ScionGenealogist data base > '
  443.   SAY ' \____________________________________________________________/'
  444.   SAY ' '
  445.   SAY '                                 '
  446.   SAY ' defaults: may be changed; RETURN accepts [value]'
  447.   svMdir = Mdir
  448.   SAY '                    'substr(blanks,1,length(DBNAME)+3)''
  449.   call writech(stdout,' HTMLs in directory  'DBNAME'G  within ['Mdir'] ')
  450.   PULL Mdir
  451.   if Mdir = '' then Mdir = svMdir
  452.   SAY ' '
  453.   svGeneralPrefix = GeneralPrefix
  454.   call writech(stdout,' General Prefix = [')
  455.   if GeneralPrefix ~= 'GENEAFI' then call writech(stdout,GeneralPrefix)
  456.   call writech(stdout,'] ')
  457.   PARSE PULL GeneralPrefix
  458.   if GeneralPrefix = '' then GeneralPrefix = svGeneralPrefix
  459.   SAY ' '
  460.   if ~MakeText then writech(stdout,' NOT')
  461.   writech(stdout,' Making printable text file; ')
  462.   call writech(stdout,' acceptable? [yes] ')
  463.   PULL answer
  464.   if answer ~= '' then do
  465.    if substr(answer,1,1) = 'N' then MakeText = ~MakeText
  466.    end
  467.   if DoPictures then do
  468.    SAY ' '
  469.    SAY '+-----------------------------------------------------------------+'
  470.    SAY '| NOTE: changing Thumbnail max dim or Thumbnail format will force |'
  471.    SAY '|       regeneration of all Thumbnail pictures. Just so you know! |'
  472.    SAY '+-----------------------------------------------------------------+'
  473.    SAY '|       If Thumbnail format is changed, Picture Albums must then  |'
  474.    SAY '|       be manually edited to reflect the new Thumbnail suffixes. |'
  475.    SAY '+-----------------------------------------------------------------+'
  476.    SAY ' '
  477.    svThumbnail = Thumbnail
  478.    call writech(stdout,' Thumbnail max dim = ['Thumbnail'] ')
  479.    PULL Thumbnail
  480.    if ~IsNumeric(Thumbnail) then Thumbnail = svThumbnail
  481.    if Thumbnail < 100 then Thumbnail = 100
  482.    SAY ' '
  483.    svThumbformat = Thumbformat
  484.    call writech(stdout,' Thumbnail format = ['Thumbformat'] ')
  485.    PULL Thumbformat
  486.    if Thumbformat ~= 'GIF' & Thumbformat ~= 'JPEG' then Thumbformat = ''
  487.    if Thumbformat = '' then Thumbformat = svThumbformat
  488.    end
  489.   SAY ' '
  490.   SAY ' Usage: start Scion & load a genealogy database;'
  491.   SAY ' '
  492.   SAY '        then: shell: rx Scion2html.rexx'
  493.   SAY '                 WB: double-click the Scion2html.rexx ICON'
  494.   SAY ' '
  495.   end
  496.  
  497.  else do
  498.   SAY '                     '
  499.   SAY '  choices:     RETURN accepts [value]'
  500.   SAY '                                      'substr(blanks,1,length(DBNAME)+2)''
  501.   SAY '  Normal    [re]make HTMLs for entire  'DBNAME'  data base'
  502.   SAY '       '
  503.   SAY '     #      [re]make HTMLs for any person #={1..'TOTALIRN'} in above data base'
  504.   SAY '          '
  505.   SAY '  Anchors   hints for: <A href="?">'DBNAME'</A>'
  506.   SAY '       '
  507.   SAY '     ?      about Scion2html.rexx; also can change defaults.'
  508.   SAY '        '
  509.   SAY '   Quit   '
  510.   SAY ' '
  511.   end
  512.  
  513.  SAY ' '
  514.  target = 'Normal'
  515.  call writech(stdout,'['target'] ')
  516.  
  517.  PULL target
  518.  
  519.  if length(target) > 1 & substr(target,1,1) = ' ' then target = substr(target,2,length(target))
  520.  if length(target) > 7 then target = substr(target,1,7)
  521.  if target = '' then target = 'Normal'
  522.  if substr(target,1,1) = '#' then do
  523.   target = ''
  524.   SAY ' '                                    /* :) :) :) :) :) */
  525.   SAY '     NOT #! an actual number, like, you know, from the set { 1 .. 'TOTALIRN' }'
  526.   end
  527.  if target = 'INFO' | target = 'ABOUT' | target = 'HELP' then target = '?'
  528.  if IsNumeric(target) then do
  529.   if target > TOTALIRN | target < 1 then do
  530.     SAY ' '
  531.     SAY '     Lousy shooting:'
  532.     SAY ' 'target' is outside range of { 1 .. 'TOTALIRN' } of persons in data base  'DBNAME' '
  533.     SAY '     Wipe off your monitor, clean your glasses, and try again!'
  534.     target = ''
  535.    end
  536.   end
  537.  target = Upper(strip(target,,'"'))    /* just in case, remove errant quotes */
  538.  end
  539.  
  540. if ~ValidTarget(target) then PauseExit()
  541.  
  542. if substr(target,1,1) = 'A' then target = 'ANCHORS'
  543. if substr(target,1,1) = 'N' then target = 'NORMAL'
  544. if substr(target,1,1) = 'T' then target = 'TEST'
  545.  
  546. /* SAY target */
  547.  
  548. 'GETPROGVERSION'
  549. VERSION = RESULT
  550.  
  551. if VERSION < 4.07 then do
  552.  SAY ' '
  553.  say 'ERROR: Requires Scion VERSION = 4.07 (or greater)'
  554.  AskExit()
  555.  end
  556.  
  557. /* Get path to database so can locate any note files in same location */
  558. 'GETDBPATH'        /* new in Scion V 4.07 */
  559. DBPATH = RESULT
  560. DBPATH = CheckPathName(DBPATH)
  561.  
  562. /*
  563. SAY ' '
  564. Say ' Testing: is data base assignment of 'DBPATH||DBNAME' visible?'
  565. SAY ' '
  566. */
  567.  
  568. PRAGMA('w','n')
  569. if ~Exists(DBPATH||DBNAME) then do
  570.  SAY 'ERROR: Scion data base 'DBNAME' not found in: 'DBPATH
  571.  AskExit()
  572.  end
  573.  
  574. if ~GoodScion2html then do
  575.  Mdir = ''            /* where to put the directories? */
  576.  if Exists(DBNAME'G') then do    /* check current path */
  577.   Mdir = PRAGMA('d')        /* we're already there */
  578.   end
  579.  else do
  580.   Tdir = "RAM:"                /* RAM: */
  581.   if Exists('Work:') then Tdir = "Work:"    /* assume Work: */
  582.   SAY ' '                /* ask, with default prompted */
  583.   if target ~= 'ANCHORS' then call writech(stdout,'Generate ')
  584.   call writech(stdout,'Directory 'DBNAME'G for HTML pages ')
  585.   if target = 'ANCHORS' then call writech(stdout,'is ')
  586.   call writech(stdout,'in: ['Tdir'] ')
  587.   PULL Mdir
  588.   if Mdir = '' then Mdir = Tdir        /* default was accepted */
  589.   end
  590.  end
  591.  
  592. Mdir = CheckPathName(Mdir)
  593.  
  594. PRAGMA('w','w')
  595.  
  596. Gdir = Mdir||DBNAME'G'
  597. Tdir = ''
  598. if MakeText then Tdir = Mdir||DBNAME'T'
  599.  
  600. RemakeThumb = ( origThumbnail ~= Thumbnail ) | ( origThumbformat ~= Thumbformat )
  601.  
  602. if target ~= "ANCHORS" then do
  603.  if ~Makedir(Gdir) then do
  604.   SAY ' '
  605.   SAY 'ERROR: unable to create directory: 'Gdir
  606.   AskExit()
  607.   end
  608.  
  609.  if Tdir ~= '' then do
  610.   if ~Makedir(Tdir) then do
  611.    SAY ' '
  612.    SAY 'ERROR: unable to create directory: 'Tdir
  613.    AskExit()
  614.    end
  615.   end
  616. /*
  617.  Say "Number of people in database " DBNAME " = " TOTALIRN
  618.  SAY ' '
  619. */
  620.  end
  621.  
  622. starttime = Time('e')
  623.  
  624. Open('Scion2html','S:Scion2html.Config','w')
  625. call writeln('Scion2html',Mdir)
  626. call writeln('Scion2html',Thumbnail)
  627. call writeln('Scion2html',Thumbformat)
  628. call writeln('Scion2html',MakeText)
  629. if GeneralPrefix ~= 'GENEAFI' then call writeln('Scion2html',GeneralPrefix)
  630. Close('Scion2html')
  631.  
  632. if IsNumeric(target) then do
  633.  'GETLASTNAME' target
  634.  thelastname = GetLastName(RESULT)
  635.  'GETFIRSTNAME' target
  636.  
  637.  answer = 'yes'
  638.  call writech(stdout,'HTMLs for: 'GetFullName(RESULT)'? ['answer'] ')
  639.  PULL answer
  640.  if answer = '' then answer = 'yes'
  641.  if substr(answer,1,1) ~= 'y' then AskExit()
  642.  
  643.  starttime = Time('e')
  644.  
  645.  if target <= TOTALIRN then do
  646. /*
  647.   Say 'Processing person ' target ' of ' TOTALIRN ' in database ' DBNAME
  648. */
  649.   if Tdir ~= '' then Open('GenealogyText',Tdir'/G'target,'w')
  650.   CALL MakeOne(target)
  651.   if Tdir ~= '' then Close('GenealogyText')
  652.   end
  653.  end
  654.  
  655. else do
  656.  
  657.  target = Upper(target)
  658.  
  659.  if target = "TEST" then do
  660.  
  661.   DO i = 1 TO 7
  662.   if Tdir ~= '' then Open('GenealogyText',Tdir'/G'i,'w')
  663.   CALL MakeOne(i)
  664.   if Tdir ~= '' then Close('GenealogyText')
  665.    end
  666.   end
  667.  
  668.  else if target ~= "ANCHORS" then do
  669.  
  670.   target = 'NORMAL'
  671.   Say ' '
  672.   Say 'Processing all ' TOTALIRN ' persons in database ' DBNAME
  673.  
  674. /* GENEAFIL.htm is a Scion data base IRN order list of all persons in 
  675.    html format: person * birthdate + deathdate (()) father & mother */
  676.  
  677.   Say ' '
  678.   Say 'file name: 'Gdir'/'GeneralPrefix'L.htm for: List of Persons.'
  679.  
  680.   Open('GenealogyFile',Gdir'/'GeneralPrefix'L.htm','w')
  681.   WriteLn('GenealogyFile','<HTML>')
  682.   WriteLn('GenealogyFile','<TITLE>List of Persons.</TITLE>')
  683.   WriteLn('GenealogyFile','<H2>List of Persons in data base "'DBNAME'". <B>'Time()' - 'Date()'</B></H2>')
  684.   WriteLn('GenealogyFile','<H3>')
  685.  
  686.   if Tdir ~= '' then do
  687.    Open('GenealogyText',Tdir'/GenealogyOf'DBNAME,'w')
  688.    WriteLn('GenealogyText','Genealogy Data Base "'GetLastName(DBNAME)'"')
  689.    end
  690.  
  691.   DO i = 1 TO TOTALIRN
  692.    CALL MakeOne(i)
  693.    end
  694.  
  695.   WriteCh('GenealogyFile','</H3>')
  696.   WriteCh('GenealogyFile','<HR>')
  697.   WriteLn('GenealogyFile','<Address><H3>')
  698.   WriteCh('GenealogyFile','(<B>AMIGA</B> ® <A href="http://www.')
  699.   WriteLn('GenealogyFile','veronica.nl/escom/"><B>ESCOM</B></A>) · ')
  700.   'GETPROGVERSION'
  701.   VERSION = RESULT
  702.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  703.   WriteCh('GenealogyFile','info/www/dirs/')
  704.   WriteCh('GenealogyFile','biz_dbase.html"><B>Scion')
  705.   if VERSION > 0 then WriteCh('GenealogyFile','V'VERSION)
  706.   WriteLn('GenealogyFile','</B></A> © <B>Robbie J Akins</B>) · ')
  707.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  708.   WriteCh('GenealogyFile','info/www/dirs/gfx_co')
  709.   WriteLn('GenealogyFile','nv.html"><B>GfxCon</B></A> © <B>Dirk Farin</B>) · ')
  710.   WriteCh('GenealogyFile','(<A href="http://wuarchive.wustl.edu/pub/aminet/')
  711.   WriteCh('GenealogyFile','info/www/dirs/')
  712.   WriteCh('GenealogyFile','util_rexx.html"><B>Scion2html.rexx</B></A> © ')
  713. /*
  714.   WriteCh('GenealogyFile','<A href="http://www.azstarnet.com/~dagley')
  715.   WriteCh('GenealogyFile','/IPOLYIG/P1.htm"><B>Harold Ipolyi</B></A>)')
  716. */
  717.   WriteLn('GenealogyFile','<B>Harold Ipolyi</B>)')
  718.   WriteCh('GenealogyFile','</H3></Address>')
  719.   WriteLn('GenealogyFile','</HTML>')
  720.   end
  721.  
  722.  Say ' '
  723.  Say ' '
  724.  Say ' If you have not already done so, add the following anchor pointing to'
  725.  Say ' "'GetLastName(DBNAME)' Genealogy" to a html file (maybe HOME PAGE):  '
  726.  Say ' '
  727.  Say ' <A href="/'Gdir'/'GeneralPrefix'L.htm">'GetLastName(DBNAME)' Genealogy</A>'
  728.  Say ' '
  729.  Say '          and maybe:'
  730.  Say ' '
  731.  
  732.  'GETLASTNAME' 1
  733.  thelastname = GetLastName(RESULT)
  734.  'GETFIRSTNAME' 1
  735.  P1 = GetFullName(RESULT)
  736.  
  737.  if GeneralPrefix = "GENEAFI" then
  738.   Say ' <A href="/'Gdir'/P1.htm">'P1'</A>'
  739.  else
  740.   Say ' <A href="/'Gdir'/'GeneralPrefix'P1.htm">'P1'</A>'
  741.  Say ' '
  742.   end
  743.  
  744. /*
  745.  Open('CreditsFile','ram:Credits.html','w')
  746. */
  747.  
  748.  elapsedtime =  Time('e') - starttime
  749.  
  750.  spacer = substr(blanks,1,Length(elapsedtime))
  751.  
  752.  Say ' '
  753.  Say '                                        'spacer'         '
  754.  Say '  Scion2html.rexx completed normally in 'elapsedtime' seconds '
  755.  Say '                                        'spacer'         '
  756.  
  757.  AskExit()
  758.  
  759.  EXIT    /* redundant */
  760.  
  761. /*************************************************************************
  762. *                                                                        *
  763. *  Makeone procedure extracts data and creates page for a single person  *
  764. *                                                                        *
  765. *************************************************************************/
  766.  
  767. MakeOne: PROCEDURE EXPOSE target DBPATH RemakeThumb Thumbnail Thumbformat DBNAME GeneralPrefix Gdir Tdir DoPictures
  768.  PARSE ARG ScionIRN
  769.  
  770. 'EXISTPERSON' ScionIRN
  771. if RESULT = 'YES' then do
  772.  
  773.  if GeneralPrefix = "GENEAFI" then do
  774.   PersonPrefix = "P"            /* Person file name prefix */
  775.   FamilyPrefix = "F"            /* Family file name prefix */
  776.   end
  777.  else do
  778.   PersonPrefix = GeneralPrefix"P"    /* Person file name prefix */
  779.   FamilyPrefix = GeneralPrefix"F"    /* Family file name prefix */
  780.   end
  781.  
  782.  if FamilyPrefix = PersonPrefix then do
  783.   say ' FamilyPrefix MUST NOT EQUAL PersonPrefix'
  784.   say ' 'FamilyPrefix'                           'PersonPrefix
  785.   AskExit()
  786.   EXIT
  787.   end
  788.  
  789.  HasFileFATHER = 0
  790.  HasFileMOTHER = 0
  791.  HasMOTHER = 0
  792.  HasFATHER = 0
  793.  HasPARENTS = 0
  794.  HasCHILDREN = 0
  795.  DoGenText = 0
  796.  'GETPARENTS' ScionIRN
  797.  PARENTS = RESULT
  798.  tPARENTSt = 't'PARENTS't'
  799. /* Say 'PARENTS = 'PARENTS tPARENTSt    ??? EXISTPARENTS IRN ??? */
  800.  if tPARENTSt ~= 'tt' then HasPARENTS = 1
  801.  'GETMARRIAGE' ScionIRN 0    /*      ??? GETTOTMARRIAGES IRN ???     */
  802.  MARRIAGE = RESULT
  803.  tMARRIAGESt = 't'MARRIAGE't'
  804. /*    Say 'MARRIAGES = 'MARRIAGE tMARRIAGESt        */
  805.  if tMARRIAGESt ~= 'tMARRIAGEt' then do
  806.   mFGRN = MARRIAGE
  807.   'GETNUMCHILD' mFGRN
  808.   if RESULT > 0 then HasCHILDREN = 1
  809.  end
  810. /*
  811. Say 'PARENTS = 'PARENTS tPARENTSt 'MARRIAGES = 'MARRIAGES tMARRIAGESt 'HasPARENTS = 'HasPARENTS 'HasCHILDREN = 'HasCHILDREN
  812. */
  813.  if Tdir ~= '' & ( HasPARENTS + HasCHILDREN ) = 1 then doGenText = 1
  814.  
  815.  'GETLASTNAME' ScionIRN
  816.  LASTNAME = GetLastName(RESULT)
  817.  'GETFIRSTNAME' ScionIRN
  818.  FIRSTNAME = RESULT
  819.  'GETSEX' ScionIRN
  820.  GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  821.  thelastname = LASTNAME
  822.  thegender = GENDER
  823.  FULLNAME = GetFullName(FIRSTNAME)
  824.  MFULLNAME = MGetFullName(FIRSTNAME)
  825.  PFULLNAME = PGetFullName(FIRSTNAME)
  826.  'GETBIRTHDATE' ScionIRN
  827.  BIRTHDATE = RESULT
  828.  'GETBIRTHPLACE' ScionIRN
  829.  BIRTHPLACE = RESULT
  830.  'GETBAPTISMDATE' ScionIRN
  831.  BAPTISMDATE = RESULT
  832.  'GETRELIGION' ScionIRN
  833.  RELIGION = RESULT
  834.  'GETBAPTISMPLACE' ScionIRN
  835.  BAPTISMPLACE = RESULT
  836.  'GETDEATHDATE' ScionIRN
  837.  DEATHDATE = RESULT
  838.  'GETDEATHPLACE' ScionIRN
  839.  DEATHPLACE = RESULT
  840.  'GETBURIALPLACE' ScionIRN
  841.  BURIALPLACE = RESULT
  842.  'GETDIEDOF' ScionIRN
  843.  DIEDOF = RESULT
  844.  'GETEDUCATION' ScionIRN
  845.  EDUCATION = RESULT
  846.  'GETOCCUPATION' ScionIRN
  847.  OCCUPATION = RESULT
  848.  'GETPERSCOMMENT' ScionIRN
  849.  PERSCOMMENT = RESULT
  850.  'GETPERSREFS' ScionIRN
  851.  PERSREFS = RESULT
  852. /*
  853.  ValidInfo = 0
  854.  if LASTNAME||BIRTHDATE||BIRTHPLACE||DEATHDATE||DEATHPLACE||BURIALPLACE||RELIGION||DIEDOF||EDUCATION||OCCUPATION||PERSCOMMENT||PERSREFS ~= "" THEN ValidInfo = 1
  855.  if ~ValidInfo then do
  856. Say "Person " ScionIRN"'s lacking information; no new html file being created!"
  857.   return
  858.   end
  859.  if Tdir ~= '' & ( ValidInfo | LASTNAME ~= "" ) then DoGenText = 1
  860. */
  861.  if Tdir ~= '' then DoGenText = 1
  862.  PfilN = PersonPrefix || ScionIRN
  863.  
  864.  dPfilN = Gdir'/'PfilN
  865.  Say ''
  866.  Say 'html: 'dPfilN'.htm for: 'FULLNAME' {'ScionIRN'}'
  867.  Open('PERSONFILE',dPfilN'.htm','w')
  868.  WriteLn('PERSONFILE','<HTML>')
  869.  WriteLn('PERSONFILE','<TITLE>'FULLNAME' Data Sheet</TITLE>')
  870.  WriteLn('PERSONFILE','<PRE><TT>')
  871.  
  872.  if Exists(DBPATH'PP'ScionIRN'.'DBNAME) & DoPictures then do
  873.  if RemakeThumb then do
  874.   DELETE(dPfilN'.GIF')
  875.   DELETE(dPfilN'.JPEG')
  876.   end
  877.  
  878.   if AgeTest(DBPATH'PP'ScionIRN'.'DBNAME, dPfilN'.jpg') then do
  879.    Delete(dPfilN'.'Thumbformat)
  880.    end
  881.  
  882.   WriteCh('PERSONFILE','   <A HREF="'PfilN'A.htm')
  883.   WriteLn('PERSONFILE','"><img src="'PfilN'.'Thumbformat'"></A>')
  884.   end
  885.  
  886.  WriteCh('PERSONFILE',MFULLNAME)
  887.  
  888.  if Exists(DBPATH'PN'ScionIRN'.'DBNAME) then do
  889.   if AgeTest(DBPATH'PN'ScionIRN'.'DBNAME, dPfilN'I.htm') then do
  890.    Say 'Writing info ¶ file 'dPfilN'I.htm'
  891.    Open('PNDBNAME',DBPATH'PN'ScionIRN'.'DBNAME,'r')
  892.    Open('PERSONI',dPfilN'I.htm','w')
  893.    WriteLn('PERSONI','<HTML>')
  894.    WriteLn('PERSONI','<TITLE>'FULLNAME' Information</TITLE>')
  895.    WriteCh('PERSONI','<A HREF="'PfilN'.htm">'MFULLNAME)
  896.    WriteCh('PERSONI','</A> Information. (<A HREF="'GeneralPrefix'L.htm">')
  897.    WriteLn('PERSONI','<B>List of persons.</B></A>)<PRE><TT>')
  898.    if DoGenText then WriteLn('GenealogyText',PFULLNAME' Information.')
  899.    DO While ~EOF('PNDBNAME')
  900.     line = ReadLn('PNDBNAME')
  901.     WriteLn('PERSONI',CheckForReplacement(line))
  902.     if DoGenText then WriteLn('GenealogyText',CheckForNAReplacement(line))
  903.     end
  904.    Close('PNDBNAME')
  905.    if DoGenText then WriteLn('GenealogyText',' ')
  906.    WriteLn('PERSONI','</HTML>')
  907.    Close('PERSONI')
  908.    end
  909.   else do
  910.    if DoGenText then do
  911.     WriteLn('GenealogyText',PFULLNAME' Information.')
  912.     Open('PNDBNAME',DBPATH'PN'ScionIRN'.'DBNAME,'r')
  913.     DO While ~EOF('PNDBNAME')
  914.      line = ReadLn('PNDBNAME')
  915.      WriteLn('GenealogyText',CheckForNAReplacement(line))
  916.      end
  917.     WriteLn('GenealogyText',' ')
  918.     Close('PNDBNAME')
  919.     end
  920.    end
  921.   WriteCh('PERSONFILE',' (<A HREF="'PfilN'I.htm"> ¶ </A>)')
  922.   end
  923.  
  924.  if Exists(DBPATH'PP'ScionIRN'.'DBNAME) & DoPictures then do
  925.  
  926.  
  927.   if ~Exists(dPfilN'.jpg') then do
  928.    Say 'Creating picture 'dPfilN'.jpg'
  929. /*
  930. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  931. */
  932. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  933. OldStackSize = pragma('s',21000)
  934. address command 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.jpg FORMAT JPEG QUALITY 100'
  935. call pragma('s',OldStackSize)
  936.    end
  937.   if Exists(dPfilN'.'Thumbformat) then do
  938.    Say '  ~ image 'dPfilN'.'Thumbformat'  ...OK... '
  939.    end
  940.   else do
  941.    Say 'Creating image 'dPfilN'.'Thumbformat
  942. /*
  943. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'Thumbformat' FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  944. */
  945. Say 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'Thumbformat' FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  946. OldStackSize = pragma('s',21000)
  947. address command 'Sys:Tools/GfxCon 'DBPATH'PP'ScionIRN'.'DBNAME' TO 'dPfilN'.'Thumbformat' FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  948. call pragma('s',OldStackSize)
  949.    end                   
  950. WriteCh('PERSONFILE',' (<A HREF="'PfilN'A.htm"><B> ® </B></A>)')
  951.   if Exists(dPfilN'A.htm') then do
  952.    Say '  ~ picture album 'dPfilN'A.htm  ...OK... '
  953.    end
  954.   else do
  955.    Say 'Creating picture album ® 'dPfilN'A.htm'
  956.    Open('PERSONP',dPfilN'A.htm','w')
  957.    WriteLn('PERSONP','<HTML>')
  958.    WriteLn('PERSONP','<TITLE>'FULLNAME' Picture Album</TITLE>')
  959.    WriteCh('PERSONP',MFULLNAME' . ')
  960.    WriteCh('PERSONP','<A HREF="'PfilN'.jpg">')
  961.    WriteLn('PERSONP','<img src="'PfilN'.'Thumbformat'"></A>')
  962.    WriteLn('PERSONP',' . <B>Picture Album</B><HR><pre><tt>')
  963.    WriteCh('PERSONP','<H3>another JPEG picture <A HREF="'PfilN'A1.jpg">')
  964.    WriteCh('PERSONP','<img src="'PfilN'A1.'Thumbformat'"></A> anchored by ')
  965.    WriteLn('PERSONP','thumbnail image created by:')
  966.    WriteCh('PERSONP','GfxCon 'dPfilN'A1.jpg TO 'dPfilN'A1.'Thumbformat' FORMAT ')
  967.    WriteCh('PERSONP',Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail)
  968.    WriteLn('PERSONP','<HR></pre></tt>')
  969.    WriteLn('PERSONP','<B>Edit</B> 'dPfilN'A.htm <B>to add more pictures to the Picture Album<P>')
  970.    WriteCH('PERSONP','CAUTION: deleting Directory:</B> 'Gdir' <B>destroys all Picture ')
  971.    WriteLn('PERSONP',' Album modifications. YOUR WORK WILL BE LOST!</B>')
  972.    WriteLn('PERSONP','</HTML>')
  973.    Close('PERSONP')
  974.    end
  975.   end
  976.  
  977.  WriteLn('PERSONFILE',' (<A HREF="'GeneralPrefix'L.htm"><B>List of persons.</B></A>)')
  978.  if DoGenText then do
  979.   if target ~= "NORMAL" then Say 'Printable file: 'Tdir'/G'ScionIRN' for 'FULLNAME' {'ScionIRN'}'
  980.   WriteLn('GenealogyText','')
  981.   WriteLn('GenealogyText','-----------------------------------------------------------')
  982.   WriteLn('GenealogyText','')
  983.   WriteLn('GenealogyText',PFULLNAME' Data Sheet')
  984.   end
  985.  if BIRTHDATE || BIRTHPLACE ~= "" then do
  986.   PersOutputCh('Born: ',0)
  987.   if BIRTHDATE ~= "" then PersOutputCh(BIRTHDATE,0)
  988.   if BIRTHPLACE ~= "" then PersOutputCh(' * 'BIRTHPLACE,0)
  989.   PersOutputCr()
  990.   end
  991.  if BAPTISMDATE || BAPTISMPLACE || RELIGION ~= "" then do
  992.   PersOutputCh('Baptised: ')
  993.   PersOutputCh(BAPTISMDATE' ')
  994.   if RELIGION ~= "" then PersOutputCh('{'RELIGION'} ',0)
  995.   if BAPTISMPLACE ~= "" then PersOutputCh(BAPTISMPLACE,0)
  996.   PersOutputCr()
  997.   end
  998.  if DEATHDATE ~= "" & DEATHDATE ~= "dead" then do
  999.   PersOutputCh('Died: 'DEATHDATE,0)
  1000.   if DEATHPLACE ~= "" then PersOutputCh(' + 'DEATHPLACE,0)
  1001.   if BURIALPLACE ~= "" then PersOutputCh(' . Buried: 'BURIALPLACE,0)
  1002.   PersOutputCr()
  1003.   end
  1004.  else do
  1005.   if DEATHPLACE ~= "" then PersOutputLn(DEATHPLACE,1)
  1006.   if BURIALPLACE ~= "" then PersOutputLn(BURIALPLACE,1)
  1007.   end
  1008.  if DIEDOF ~= "" then PersOutputLn('Cause of Death: 'DIEDOF,1)
  1009.  if EDUCATION ~= "" then PersOutputLn('Education: 'EDUCATION,1)
  1010.  if OCCUPATION ~= "" then PersOutputLn('Occupation: 'OCCUPATION,1)
  1011.  if PERSCOMMENT ~= "" then PersOutputLn('Comments: 'PERSCOMMENT,1)
  1012.  if PERSREFS ~= "" then PersOutputLn('References: 'PERSREFS,1)
  1013.  
  1014. /* end of personal data; start family tree segment */
  1015.  
  1016.  PersOutputHL()
  1017.  HeadLine = ''
  1018.  if HasPARENTS then HeadLine = HeadLine' ·Parents '
  1019.  'GETNUMSIB' ScionIRN
  1020.  xtra = ''
  1021.  if RESULT > 1 then xtra = 's'
  1022.  if RESULT > 0 then HeadLine = HeadLine' ·Sibling'xtra' '
  1023.  'GETNUMMARRY' ScionIRN
  1024.  xtra = ''
  1025.  if RESULT > 1 then xtra = 's'
  1026.  if RESULT > 0 then HeadLine = HeadLine' ·Spouse'xtra' '
  1027.  'GETTOTALCHILD' ScionIRN
  1028.  xtra = 'Child'
  1029.  if RESULT > 1 then xtra = xtra'ren'
  1030.  if RESULT > 0 then HeadLine = HeadLine' ·'xtra
  1031.  PersOutputLn('Immediate Family: 'HeadLine,0)
  1032.  if DoGenText then WriteLn('GenealogyText','')
  1033.  if HasPARENTS then do
  1034.   'GETPRINCIPAL' PARENTS
  1035.   PRINCIPAL = RESULT
  1036.   'GETSPOUSE' PARENTS
  1037.   SPOUSE = RESULT
  1038.   'GETMARRYDATE' PARENTS
  1039.   PARENTSMARRIAGEDATE = RESULT
  1040.   'GETMARRYPLACE' PARENTS
  1041.   PARENTSmFGRNPLACE = RESULT
  1042.   'GETSEX' PRINCIPAL
  1043.   if RESULT = 'M' then do
  1044.    FATHERScionIRN = PRINCIPAL
  1045.    MOTHERScionIRN = SPOUSE
  1046.    end
  1047.   else do
  1048.    FATHERScionIRN = SPOUSE
  1049.    MOTHERScionIRN = PRINCIPAL
  1050.    end
  1051.   'GETLASTNAME' FATHERScionIRN
  1052.   FATHERLASTNAME = GetLastName(RESULT)
  1053.   'GETFIRSTNAME' FATHERScionIRN
  1054.   FATHERFIRSTNAME = RESULT
  1055.   if FATHERFIRSTNAME||FATHERLASTNAME ~= "" then HasFATHER = 1
  1056.   'GETLASTNAME' MOTHERScionIRN
  1057.   MOTHERLASTNAME = GetLastName(RESULT)
  1058.   'GETFIRSTNAME' MOTHERScionIRN
  1059.   MOTHERFIRSTNAME = RESULT
  1060.   if MOTHERFIRSTNAME||MOTHERLASTNAME ~= "" then HasMOTHER = 1
  1061.  
  1062.   if FATHERLASTNAME ~= "" then do
  1063.    HasFileFATHER = 1
  1064.    FATHERFILENAME = PersonPrefix || FATHERScionIRN
  1065.    end
  1066.  
  1067.   if MOTHERLASTNAME ~= "" then do
  1068.    HasFileMOTHER = 1
  1069.    MOTHERFILENAME = PersonPrefix || MOTHERScionIRN
  1070.    end
  1071.  
  1072.   if HasFileFATHER then do
  1073.    PersOutputCh('  <'FATHERScionIRN'>',1)
  1074.    PersOutputCh(' &',0)
  1075.    end
  1076.   PersOutputCh('<'MOTHERScionIRN'>',1)
  1077.   if PARENTSMARRIAGEDATE ~= "" then PersOutputCh(' & 'PARENTSMARRIAGEDATE,0)
  1078.   if PARENTSmFGRNPLACE ~= "" then PersOutputCh(' @ 'PARENTSmFGRNPLACE,0)
  1079.   PersOutputCr()
  1080.   spcs = '  |'
  1081.   DO i = 0 TO Length(FATHERFULLNAME)
  1082.    spcs = spcs' '     /* ??? GETFAMLBL1 ??? */
  1083.   end            /* ??? GETFAMLBL2 ??? */
  1084.  
  1085.  Minfo = Exists(DBPATH'FN'PARENTS'.'DBNAME)
  1086.  if PARENTSmFGRNCELEBRANT ~= '' | Minfo then do
  1087.   if DoGenText then WriteLn('GenealogyText','  |')   
  1088.   'GETNUMCHILD' PARENTS
  1089.   TOTCHILDREN = RESULT
  1090. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  1091.   DO i = 0 TO TOTCHILDREN
  1092.    'GETCHILD' PARENTS i
  1093.    PARENTSc = RESULT
  1094.    'GETFIRSTNAME' PARENTSc
  1095.    PARENTScFIRSTNAME = RESULT
  1096.  
  1097.    if PARENTScFIRSTNAME ~= "" then do
  1098.     if PARENTSc ~= ScionIRN then do
  1099.      'GETLASTNAME' PARENTSc
  1100.      PARENTScLASTNAME = GetLastName(RESULT)
  1101.  
  1102.      LastNameFl = 1
  1103.      if PARENTScLASTNAME = FATHERLASTNAME then do
  1104.       LastNameFl = -1
  1105.       LastNameVal = FATHERLASTNAME
  1106.       end
  1107.      PersOutputCh('  |_',0)
  1108.      PersOutputCh('<'PARENTSc'>',LastNameFl)
  1109.      LastNameFl = 1
  1110.  
  1111.     'GETBIRTHDATE' PARENTSc
  1112.     if RESULT ~= "" then PersOutputCh('   * 'RESULT,0)
  1113.      'GETDEATHDATE' PARENTSc
  1114.     if RESULT ~= "" & RESULT ~= "dead" then PersOutputCh('   + 'RESULT,0)
  1115.  
  1116.     PersOutputCr()
  1117.     end
  1118.    end
  1119.   end
  1120.  end
  1121.  PersOutputLn('  |',0)
  1122. END
  1123.  
  1124. /* end of parents, siblings segment; start marriages segment */
  1125.  
  1126. vert.0 = ''
  1127. vert.1 = '|'
  1128. 'GETNUMMARRY' ScionIRN
  1129. TOTMARRIAGES = RESULT
  1130. /* say 'TOTMARRIAGES = 'TOTMARRIAGES */
  1131. DO i = 0 TO TOTMARRIAGES
  1132.  'GETMARRIAGE' ScionIRN i
  1133.  MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
  1134.  if MARRIAGE > -1 then do
  1135.   MARRIAGES = i
  1136.   j = i + 1
  1137.   vert.j = vert.1||vert.i
  1138.   end
  1139.  end
  1140. tMARRIAGESt = 't'MARRIAGES't'
  1141.  PersOutputCh('  |_',0) 
  1142.  if tMARRIAGESt ~= 'tMARRIAGESt' then do
  1143.   DO i = 0 TO MARRIAGES
  1144.    'GETMARRIAGE' ScionIRN i
  1145.    mFGRN = RESULT
  1146.    if mFGRN ~= "" then do
  1147.     ki = MARRIAGES - i + 1
  1148.     if ki ~= MARRIAGES + 1 then PersOutputLn('    'vert.ki,0)
  1149.     j = MARRIAGES + 1 - i
  1150.     'GETSPOUSE' mFGRN
  1151.     SPOUSE = RESULT
  1152.     if SPOUSE = ScionIRN then do
  1153.      'GETPRINCIPAL' mFGRN
  1154.      SPOUSE = RESULT
  1155.      end
  1156.     'GETLASTNAME' SPOUSE
  1157.     SPOUSELASTNAME = GetLastName(RESULT)
  1158.     'GETFIRSTNAME' SPOUSE
  1159.     SPOUSEFIRSTNAME = RESULT
  1160.     thelastname = SPOUSELASTNAME
  1161.     'GETSEX' SPOUSE
  1162.     thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1163.     SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  1164.     MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  1165.     PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  1166.     'GETBIRTHDATE' SPOUSE
  1167.     SPOUSEBIRTHDATE = RESULT
  1168.     'GETMARRYDATE' mFGRN
  1169.     MARRIAGEDATE = RESULT
  1170.     'GETMARRYPLACE' mFGRN
  1171.     mFGRNPLACE = RESULT
  1172.  
  1173.     SPOUSEFILENAME = PersonPrefix || SPOUSE
  1174.  
  1175.     if i = 0 then do
  1176.      PersOutputCh('<'ScionIRN'> &',1)
  1177.      PersOutputCh('<'SPOUSE'>',1)
  1178.      end
  1179.  
  1180.     else do
  1181.      PersOutputCh('    'vert.j'_&',0)
  1182.      PersOutputCh('<'SPOUSE'>',1)
  1183.      end
  1184.  
  1185.     if MARRIAGEDATE ~= "" then PersOutputCh(' & 'MARRIAGEDATE,0)
  1186.     if mFGRNPLACE ~= "" then PersOutputCh(' @ 'mFGRNPLACE,0)
  1187.     PersOutputCr()
  1188.     jk = MARRIAGES - i
  1189.     spcs = '    'vert.jk'    |'
  1190.  
  1191.     FfilN = Gdir'/'FamilyPrefix || mFGRN
  1192.     Minfo = 0
  1193.     if Exists(DBPATH'FN'mFGRN'.'DBNAME) then do
  1194.      Minfo = 1
  1195.  
  1196.      if AgeTest(DBPATH'FN'mFGRN'.'DBNAME,FfilN'I.htm') then do
  1197.       Say 'Writing info ¶ file 'FfilN'I.htm'
  1198.       Open('FNDBNAME',DBPATH'FN'mFGRN'.'DBNAME,'r')
  1199.       Open('FAMILYI',FfilN'I.htm','w')
  1200.       WriteLn('FAMILYI','<HTML>')
  1201.       WriteCh('FAMILYI','<TITLE>'MFULLNAME' & ')
  1202.       WriteLn('FAMILYI',MSPOUSEFULLNAME' Family Information</TITLE>')
  1203.  
  1204.       if Exists(DBPATH'FP'mFGRN'.'DBNAME) & DoPictures then do
  1205.        WriteCh('FAMILYI','<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1206.        WriteCh('FAMILYI','"><img src="'FamilyPrefix || mFGRN'.'Thumbformat'"></A>')
  1207.        end
  1208.  
  1209.       WriteCh('FAMILYI','<H2>Family of 'MFULLNAME' & ')
  1210.       WriteCh('FAMILYI',MSPOUSEFULLNAME)
  1211.  
  1212.       if Exists(DBPATH'FP'mFGRN'.'DBNAME) & DoPictures then do
  1213.        WriteCh('FAMILYI',' (<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1214.        WriteCh('FAMILYI','"><B> ® </B></A>) ')
  1215.        end
  1216.  
  1217.       WriteCh('FAMILYI',' (<A HREF="'GeneralPrefix'L.htm">')
  1218.       WriteLn('FAMILYI','<B>List of persons.</B></A>)</H2><PRE><TT>')
  1219.       DO While ~EOF('FNDBNAME')
  1220.        line = ReadLn('FNDBNAME')
  1221.        WriteLn('FAMILYI',CheckForReplacement(line))
  1222. /*
  1223. if DoGenText then WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  1224. */
  1225.        end
  1226.       Close('FNDBNAME')
  1227.       WriteLn('FAMILYI','</HTML>')
  1228.       Close('FAMILYI')
  1229.       end
  1230.      end
  1231.  
  1232.     Palbum = 0
  1233.     if Exists(DBPATH'FP'mFGRN'.'DBNAME) & DoPictures then do
  1234.  
  1235.      Palbum = 1
  1236.      if RemakeThumb then do
  1237.       DELETE(FfilN'.GIF')
  1238.       DELETE(FfilN'.JPEG')
  1239.       end
  1240.      if AgeTest(DBPATH'FP'mFGRN'.'DBNAME,FfilN'.jpg') then do
  1241.       Delete(FfilN'.'Thumbformat)
  1242.       end
  1243.  
  1244.      if ~Exists(FfilN'.jpg') then do
  1245.       Say 'Creating picture 'FfilN'.jpg'
  1246. /*
  1247. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1248. */
  1249. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1250. OldStackSize = pragma('s',21000)
  1251. address command 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.jpg FORMAT JPEG QUALITY 100'
  1252. call pragma('s',OldStackSize)
  1253.       end
  1254.      if Exists(FfilN'.'Thumbformat) then do
  1255.       Say '  ~ image 'FfilN'.'Thumbformat'  ...OK... '
  1256.       end
  1257.      else do
  1258.       Say 'Creating image 'FfilN'.'Thumbformat''
  1259. /*
  1260. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'Thumbformat' FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  1261. */
  1262. Say 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'Thumbformat' FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  1263. OldStackSize = pragma('s',21000)
  1264. address command 'Sys:Tools/GfxCon 'DBPATH'FP'mFGRN'.'DBNAME' TO 'FfilN'.'Thumbformat' FORMAT 'Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail
  1265. call pragma('s',OldStackSize)
  1266.       end
  1267.      if Exists(FfilN'A.htm') then do
  1268.       Say '  ~ picture album 'FfilN'A.htm  ...OK... '
  1269.       end
  1270.      else do
  1271.       Say 'Creating picture album ® 'FfilN'A.htm'
  1272.       Open('FAMILYP',FfilN'A.htm','w')
  1273. WriteLn('FAMILYP','<HTML>')
  1274. WriteCh('FAMILYP','<TITLE>'MFULLNAME' & ')
  1275. WriteCh('FAMILYP',MSPOUSEFULLNAME)
  1276. WriteLn('FAMILYP',' Family Picture Album</TITLE>')
  1277. WriteCh('FAMILYP',MFULLNAME' & ')
  1278. WriteCh('FAMILYP',MSPOUSEFULLNAME)
  1279. WriteCh('FAMILYP',' <B>Family</B> . ')
  1280. WriteCh('FAMILYP','<A HREF="'FamilyPrefix || mFGRN'.jpg">')
  1281. WriteCh('FAMILYP','<img src="'FamilyPrefix || mFGRN'.'Thumbformat'"></A>')
  1282. WriteLn('FAMILYP',' . <B> Picture Album </B><HR><pre><tt>')
  1283. WriteCh('FAMILYP','another JPEG picture <A HREF="'FamilyPrefix || mFGRN)
  1284. WriteCh('FAMILYP','A1.jpg"><img src="')
  1285. WriteCh('FAMILYP',FamilyPrefix || mFGRN'A1.'Thumbformat'"></A> anchored by ')
  1286. WriteLn('FAMILYP','thumbnail image created by:')
  1287. WriteCh('FAMILYP','GfxCon 'FfilN'A1.jpg TO 'FfilN'A1.'Thumbformat' FORMAT ')
  1288. WriteCh('FAMILYP',Thumbformat' BOXFIT 'Thumbnail' 'Thumbnail)
  1289. WriteLn('FAMILYP','<HR></pre></tt>')
  1290. WriteLn('FAMILYP','<B>Edit</B> 'FfilN'A.htm <B>to add more pictures to the Picture Album<P>')
  1291. WriteCH('FAMILYP','CAUTION: deleting Directory:</B> 'Gdir' <B>destroys all Picture ')
  1292. WriteLn('FAMILYP',' Album modifications. YOUR WORK WILL BE LOST!</B>')
  1293. WriteLn('FAMILYP','</HTML>')
  1294.       Close('FAMILYP')
  1295.       end
  1296.      end
  1297.  
  1298.     if MARRIAGECELEBRANT ~= '' | Minfo | Palbum then do
  1299.      if Minfo then
  1300.       WriteCh('PERSONFILE',spcs'(<A HREF="'FamilyPrefix || mFGRN'I.htm"> ¶ </A>) ')
  1301.  
  1302.      if Exists(DBPATH'FP'mFGRN'.'DBNAME) & DoPictures then do
  1303.       WriteCh('PERSONFILE',' (<A HREF="'FamilyPrefix || mFGRN'A.htm')
  1304.       WriteCh('PERSONFILE','"><B> ® </B></A>) ')
  1305.       end
  1306.      if ( Exists(DBPATH'FP'mFGRN'.'DBNAME) & DoPictures ) | Minfo then 
  1307.       WriteLn('PERSONFILE',' ')
  1308.  
  1309.      'GETCELEBRANT' mFGRN
  1310.      if RESULT ~= "" then PersOutputLn(spcs' Celebrant: 'RESULT,1)
  1311.      'GETWITNESS' mFGRN
  1312.      if RESULT ~= "" then PersOutputLn(spcs'   Witness: 'RESULT,1)
  1313.      'GETFAMCOMMENT' mFGRN
  1314.      if RESULT ~= "" then PersOutputLn(spcs'  Comments: 'RESULT,1)
  1315.      'GETENDDATE' mFGRN
  1316.      ENDDATE = RESULT
  1317.      'GETENDING' mFGRN
  1318.      ENDING = RESULT
  1319.      if ENDDATE ~= "" | ENDING > 0 then do
  1320.       PersOutputCh(spcs,0)
  1321.       PersOutputCh('     Ended: ',0)
  1322.       if ENDDATE ~= "" then PersOutputCh(ENDDATE,0)
  1323.       if ENDING = 1 then PersOutputCh(' · None',0)
  1324.       if ENDING = 2 then PersOutputCh(' · Divorce',0)
  1325.       if ENDING = 3 then PersOutputCh(' · Separation',0)
  1326.       if ENDING = 4 then PersOutputCh(' · Annulment',0)
  1327.       if ENDING = 5 then PersOutputCh(' · Death',0)
  1328.       PersOutputCr()
  1329.       end
  1330.  
  1331.      'GETFAMREFS' mFGRN
  1332.      if RESULT ~= "" then PersOutputLn(spcs'References: 'RESULT,1)
  1333.  
  1334.      if DoGenText then WriteLn('GenealogyText',spcs)
  1335.  
  1336.      if Minfo & DoGenText then do
  1337.       Open('FNDBNAME',DBPATH'FN'mFGRN'.'DBNAME,'r')
  1338.       DO While ~EOF('FNDBNAME')
  1339.        line = ReadLn('FNDBNAME')
  1340.        WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  1341.        end
  1342.       Close('FNDBNAME')
  1343.       end
  1344.      end
  1345.  
  1346.      'GETNUMCHILD' mFGRN
  1347.      TOTCHILDREN = RESULT
  1348. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  1349.      DO k = 0 TO TOTCHILDREN
  1350.       'GETCHILD' mFGRN k
  1351.       mFGRNc = RESULT
  1352.       'GETFIRSTNAME' mFGRNc
  1353.       mFGRNcFIRSTNAME = RESULT
  1354.  
  1355.       if mFGRNcFIRSTNAME ~= "" then do
  1356.        HasCHILDREN = 1
  1357.  
  1358.        jk = MARRIAGES - i
  1359.        LastNameFl = 1
  1360.        'GETLASTNAME' mFGRNc
  1361.        mFGRNcLASTNAME = GetLastName(RESULT) 
  1362.        if mFGRNcLASTNAME = LASTNAME then do
  1363.         LastNameFl = -1
  1364.         LastNameVal = LASTNAME
  1365.         end
  1366.        PersOutputCh('    'vert.jk'    |_<'mFGRNc'>',LastNameFl)
  1367.        LastNameFl = 1
  1368.        'GETBIRTHDATE' mFGRNc
  1369.        if RESULT ~= "" then PersOutputCh('   * 'RESULT,0)
  1370.        'GETDEATHDATE' mFGRNc
  1371.        if RESULT ~= "" & RESULT ~= "dead" then PersOutputCh('   + 'RESULT,0)
  1372.        PersOutputCr()
  1373.        end
  1374.       end
  1375.      end
  1376.  
  1377.     end
  1378.   end
  1379.  else do
  1380.   LastNameFl = 1
  1381.   if LASTNAME = FATHERLASTNAME then do
  1382.   LastNameFl = -1
  1383.    LastNameVal = FATHERLASTNAME
  1384.    end
  1385.   PersOutputLn('<'ScionIRN'>',1)
  1386.   LastNameFl = 1
  1387.  end
  1388.  
  1389.  if HasPARENTS then do
  1390.   say ' Ancestors...'
  1391.   PersOutputHL()
  1392.   PersOutputLn('Ancestors',0)
  1393.   if DoGenText then WriteLn('GenealogyText','')
  1394.   Paternal(ScionIRN,'  ')
  1395.   PersOutputCh('<'ScionIRN'>',1)
  1396.   if BIRTHDATE ~= "" then PersOutputCh(' * 'BIRTHDATE,0)
  1397.   if DEATHDATE ~= "" & DEATHDATE ~= "dead" then PersOutputCh(' + 'DEATHDATE,0)
  1398.   PersOutputCr()
  1399.   Maternal(ScionIRN,'  ')
  1400.   end
  1401.  
  1402.  if HasCHILDREN then do
  1403.   say ' Marriages and Descendants...'
  1404.   PersOutputHL()
  1405.   indent = "  "
  1406.   PersOutputLn('&Marriages and |_Descendants',0)
  1407.   if DoGenText then WriteLn('GenealogyText','')
  1408.   PersOutputCh(indent'<'ScionIRN'>',1)
  1409.   if BIRTHDATE ~= "" then PersOutputCh(' * 'BIRTHDATE,0)
  1410.   if DEATHDATE ~= "" & DEATHDATE ~= "dead" then PersOutputCh(' + 'DEATHDATE,0)
  1411.   PersOutputCr()
  1412.   marriagesANDchildren(ScionIRN,indent)
  1413.   end
  1414. /*©*/
  1415.  WriteLn('PERSONFILE','</TT></PRE>')
  1416.  WriteLn('PERSONFILE','</HTML>')
  1417.  Close('PERSONFILE')
  1418. /*©*/
  1419. /*
  1420.  if target = "NORMAL" & ValidInfo then do
  1421. */
  1422.  if target = "NORMAL" then do
  1423.   if DoGenText then WriteLn('GenealogyText',' ')
  1424.   GeneaOutputCh('<'ScionIRN'>',1)
  1425.   if BIRTHDATE ~= "" then GeneaOutputCh('  *'BIRTHDATE,0)
  1426.   if DEATHDATE ~= "" & DEATHDATE ~= "dead" then GeneaOutputCh(' +'DEATHDATE,0)
  1427.   if HasFATHER then do
  1428.    GeneaOutputCh(' · <'FATHERScionIRN'>',1)
  1429.    if HasMOTHER then GeneaOutputCh(' & <'MOTHERScionIRN'>',1)
  1430.    end
  1431.   else do
  1432.    if HasMOTHER then GeneaOutputCh(' · <'MOTHERScionIRN'>',1)
  1433.    end
  1434.   GeneaOutputLn('<BR>',0) /* do not close, we have many more to go. */
  1435.   end
  1436.  return
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442. IsNumeric: PROCEDURE
  1443.  PARSE ARG str
  1444.  return DataType(str, 'W')
  1445.  
  1446.  
  1447. /******************************** Makedir **********************************/
  1448.  
  1449. /* Makedir - If a directory under the given name already exists, or can be
  1450.    created, return 1, otherwise return 0. Though this function works
  1451.    correctly under Workbench 1.3, it has the same effect as the existing
  1452.    MAKEDIR; hence it is useful only under 2.0.
  1453. */
  1454. Makedir: procedure
  1455.  ds = statef(arg(1))
  1456.  if ds='' then
  1457.   result = 'MAKEDIR'(arg(1))
  1458.  else
  1459.   result = left(ds,3) = 'DIR'
  1460.  return result
  1461.  
  1462. Paternal: PROCEDURE EXPOSE DoGenText PersonPrefix DBNAME DBPATH
  1463.  PARSE ARG irn, indent
  1464.  'GETPARENTS' irn
  1465.  PARENTS = RESULT
  1466.  'GETPRINCIPAL' PARENTS
  1467.  PRINCIPAL = RESULT
  1468.  'GETSPOUSE' PARENTS
  1469.  SPOUSE = RESULT
  1470.  'GETSEX' PRINCIPAL
  1471.  if RESULT = 'M' then do
  1472.   FIRN = PRINCIPAL
  1473.   MIRN = SPOUSE
  1474.   end
  1475.  else do
  1476.   FIRN = SPOUSE
  1477.   MIRN = PRINCIPAL
  1478.   end
  1479.  pirn = FIRN
  1480.  if 't'pirn't' ~= 'tt' then do
  1481.   Paternal(pirn,indent'    ')
  1482.   PersOutputCh(indent' ,-',0)
  1483.   if pirnLASTNAME ~= "" then PersOutputCh('<'pirn'>',1)
  1484.   if EXISTS(DBPATH'PN'pirn'.'DBNAME) then PersOutputCh(' (¶)',0)
  1485.   if EXISTS(DBPATH'PP'pirn'.'DBNAME) then PersOutputCh(' (<B>®</B>)',0)
  1486.   'GETBIRTHDATE' pirn
  1487.   if RESULT ~= "" then PersOutputCh(' * 'RESULT,0)
  1488.   'GETDEATHDATE' pirn
  1489.   if RESULT ~= "" & RESULT ~= "dead" then PersOutputCh(' + 'RESULT,0)
  1490.   PersOutputCr()
  1491.   Maternal(pirn,indent'|   ')
  1492.   end
  1493.  return 0
  1494.  
  1495. Maternal: PROCEDURE EXPOSE DoGenText PersonPrefix DBNAME DBPATH
  1496.  PARSE ARG irn, indent
  1497.  'GETPARENTS' irn
  1498.  PARENTS = RESULT
  1499.  'GETPRINCIPAL' PARENTS
  1500.  PRINCIPAL = RESULT
  1501.  'GETSPOUSE' PARENTS
  1502.  SPOUSE = RESULT
  1503.  'GETSEX' PRINCIPAL
  1504.  if RESULT = 'M' then do
  1505.   FIRN = PRINCIPAL
  1506.   MIRN = SPOUSE
  1507.   end
  1508.  else do
  1509.   FIRN = SPOUSE
  1510.   MIRN = PRINCIPAL
  1511.   end
  1512.  pirn = MIRN
  1513.  if 't'pirn't' ~= 'tt' then do
  1514.   Paternal(pirn,indent'|   ')
  1515.   PersOutputCh(indent' `-',0)
  1516.   if pirnLASTNAME ~= "" then PersOutputCh('<'pirn'>',1)
  1517.   if EXISTS(DBPATH'PN'pirn'.'DBNAME) then PersOutputCh(' (¶)',0)
  1518.   if EXISTS(DBPATH'PP'pirn'.'DBNAME) then PersOutputCh(' (<B>®</B>)',0)
  1519.   'GETBIRTHDATE' pirn
  1520.   if RESULT ~= "" then PersOutputCh(' * 'RESULT,0)
  1521.   'GETDEATHDATE' pirn
  1522.   if RESULT ~= "" & RESULT ~= "dead" then PersOutputCh(' + 'RESULT,0)
  1523.   PersOutputCr()
  1524.   Maternal(pirn,indent'    ')
  1525.   end
  1526.  return 0
  1527.  
  1528. marriagesANDchildren: PROCEDURE EXPOSE DoGenText PersonPrefix DBNAME DBPATH
  1529.         PARSE ARG ScionIRN,indent
  1530.  'GETNUMMARRY' ScionIRN
  1531.  TOTMARRIAGES = RESULT
  1532. /* say 'TOTMARRIAGES = 'TOTMARRIAGES */
  1533.  DO i = 0 TO TOTMARRIAGES
  1534.   'GETMARRIAGE' ScionIRN i
  1535.   MARRIAGE = RESULT
  1536.   if MARRIAGE > -1 then do
  1537.    MARRIAGES = i
  1538.    end
  1539.  end
  1540.  tMARRIAGESt = 't'MARRIAGES't'
  1541. /* Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt */
  1542.  
  1543.  if tMARRIAGESt ~= 'tMARRIAGESt' then do
  1544.   DO i = 0 TO MARRIAGES
  1545.    'GETMARRIAGE' ScionIRN i
  1546.    mFGRN = RESULT
  1547.    if mFGRN ~= "" then do
  1548.     'GETSPOUSE' mFGRN
  1549.     SPOUSE = RESULT
  1550.     if SPOUSE = ScionIRN then
  1551.      DO
  1552.      'GETPRINCIPAL' mFGRN
  1553.      SPOUSE = RESULT
  1554.      end
  1555.     'GETLASTNAME' SPOUSE
  1556.     SPOUSELASTNAME = GetLastName(RESULT)
  1557.     'GETFIRSTNAME' SPOUSE
  1558.     SPOUSEFIRSTNAME = RESULT
  1559.     thelastname = SPOUSELASTNAME
  1560.     SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  1561.     PersOutputCh(indent' &',0)
  1562.     mindent = "  "
  1563.     if i <= ( MARRIAGES - 1 ) then mindent = " :"
  1564.     PersOutputCh('<'SPOUSE'>',1)
  1565. if EXISTS(DBPATH'PN'SPOUSE'.'DBNAME) then PersOutputCh(' (¶)',0)
  1566. if EXISTS(DBPATH'PP'SPOUSE'.'DBNAME) then PersOutputCh(' (<B>®</B>)',0)
  1567.     'GETBIRTHDATE' SPOUSE
  1568.     if RESULT ~= "" then PersOutputCh('   * 'RESULT,0)
  1569.     'GETDEATHDATE' SPOUSE
  1570.     if RESULT ~= "" & RESULT ~= "dead" then PersOutputCh('   + 'RESULT,0)
  1571.     PersOutputCr()
  1572.     'GETNUMCHILD' mFGRN
  1573.     TOTCHILDREN = RESULT
  1574. /* say 'TOTCHILDREN = 'TOTCHILDREN */
  1575.     DO k = 0 TO TOTCHILDREN
  1576.      'GETCHILD' mFGRN k
  1577.      mFGRNc = RESULT
  1578.      'GETFIRSTNAME' mFGRNc
  1579.      mFGRNcFIRSTNAME = RESULT
  1580.      if mFGRNcFIRSTNAME ~= "" then do
  1581.       if k = ( TOTCHILDREN - 1 ) then do
  1582.        indent2 = indent||mindent" "
  1583.        PersOutputCh(indent||mindent'|_<'mFGRNc'>',1)
  1584.        end
  1585.       else do
  1586.        indent2 = indent||mindent"|"
  1587.        PersOutputCh(indent2'_<'mFGRNc'>',1)
  1588.        end
  1589. if EXISTS(DBPATH'PN'mFGRNc'.'DBNAME) then PersOutputCh(' (¶)',0)
  1590. if EXISTS(DBPATH'PP'mFGRNc'.'DBNAME) then PersOutputCh(' (<B>®</B>)',0)
  1591.       'GETBIRTHDATE' mFGRNc
  1592.       if RESULT ~= "" then PersOutputCh('   * 'RESULT,0)
  1593.       'GETDEATHDATE' mFGRNc
  1594.       if RESULT ~= "" & RESULT ~= "dead" then PersOutputCh('   + 'RESULT,0)
  1595.       PersOutputCr()
  1596.  
  1597.       marriagesANDchildren(mFGRNc,indent2)
  1598.       end
  1599.      end
  1600.     end
  1601.    end
  1602.   end
  1603.  return 0
  1604.  
  1605. PersOutputHL: PROCEDURE EXPOSE DoGenText
  1606.  WriteLn('PERSONFILE','<HR>')
  1607.  if DoGenText then do
  1608.    WriteLn('GenealogyText','')
  1609.    WriteLn('GenealogyText','-----------------------------------------------------------')
  1610.    WriteLn('GenealogyText','')
  1611.    end
  1612.  return 0
  1613.  
  1614. PersOutputCr: PROCEDURE EXPOSE DoGenText
  1615.  WriteLn('PERSONFILE','')
  1616.  if DoGenText then WriteLn('GenealogyText','')
  1617.  return 0
  1618.  
  1619. PersOutputCh: PROCEDURE EXPOSE DoGenText PersonPrefix LastNameFl LastNameVal
  1620.  if arg(1) ~= "" then do
  1621.   if arg(2) = 0 then do
  1622.    WriteCh('PERSONFILE',arg(1))
  1623.    if DoGenText then WriteCh('GenealogyText',arg(1))
  1624.    end
  1625.   else do
  1626.    WriteCh('PERSONFILE',CheckForReplacement(arg(1)))
  1627.    if DoGenText then WriteCh('GenealogyText',CheckForNAReplacement(arg(1)))
  1628.    end
  1629.  end
  1630.  return 0
  1631.  
  1632. PersOutputLn: PROCEDURE EXPOSE DoGenText PersonPrefix LastNameFl LastNameVal
  1633.  if arg(1) ~= "" then do
  1634.   if arg(2) = 0 then do
  1635.    WriteLn('PERSONFILE',arg(1))
  1636.    if DoGenText then WriteLn('GenealogyText',arg(1))
  1637.    end
  1638.   else do
  1639.    WriteLn('PERSONFILE',CheckForReplacement(arg(1)))
  1640.    if DoGenText then WriteLn('GenealogyText',CheckForNAReplacement(arg(1)))
  1641.    end
  1642.  end
  1643.  return 0
  1644.  
  1645. GeneaOutputCr: PROCEDURE EXPOSE DoGenText
  1646.  WriteLn('GenealogyFile','')
  1647.  return 0
  1648.  
  1649. GeneaOutputCh: PROCEDURE EXPOSE DoGenText PersonPrefix LastNameFl LastNameVal
  1650.  if arg(1) ~= "" then do
  1651.   if arg(2) = 0 then do
  1652.    WriteCh('GenealogyFile',arg(1))
  1653.    end
  1654.   else do
  1655.    WriteCh('GenealogyFile',CheckForReplacement(arg(1)))
  1656.    end
  1657.  end
  1658.  return 0
  1659.  
  1660. GeneaOutputLn: PROCEDURE EXPOSE DoGenText PersonPrefix LastNameFl LastNameVal
  1661.  if arg(1) ~= "" then do
  1662.   if arg(2) = 0 then do
  1663.    WriteLn('GenealogyFile',arg(1))
  1664.    end
  1665.   else do
  1666.    WriteLn('GenealogyFile',CheckForReplacement(arg(1)))
  1667.    end
  1668.  end
  1669.  return 0
  1670.  
  1671. /***************************************************************
  1672. * Check for "<IRN>" and replace with Person Name (with anchor) *
  1673. ***************************************************************/
  1674.  
  1675. CheckForReplacement: PROCEDURE EXPOSE PersonPrefix LastNameFl LastNameVal
  1676.  PARSE ARG line "<" last
  1677.  if last = "" then return CheckReplacement(line)
  1678. /* if last = "" then return line */
  1679.  RIRN = GetRIRN(last || ".")
  1680.  if RIRN = 0 then return line || "<" || last
  1681.  last = CheckForReplacement(last)
  1682.  lastend = GetEnd(last || ".")
  1683.  'GETLASTNAME' RIRN
  1684.  RIRNLASTNAME = GetLastName(RESULT)
  1685.  'GETFIRSTNAME' RIRN
  1686.  RIRNFIRSTNAME = RESULT
  1687.  thelastname = RIRNLASTNAME
  1688.  'GETSEX' RIRN
  1689.  GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1690.  if LastNameFl = -1 & RIRNLASTNAME = LastNameVal then do
  1691.   if GENDER = "m" then
  1692.    RIRNFULLNAME = '<B>' || RIRNFIRSTNAME || '</B>'
  1693.   else
  1694.    RIRNFULLNAME = '<I>' || RIRNFIRSTNAME || '</I>'
  1695.   end
  1696.  else do
  1697.   if GENDER = "m" then
  1698.    RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1699.   else
  1700.    RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1701.   end
  1702.  RIRNFILENAME = PersonPrefix || RIRN
  1703.  return line || '<A HREF="'RIRNFILENAME'.htm">'RIRNFULLNAME'</A>' || lastend
  1704.  
  1705. /***************************************************************
  1706. * Check for "[IRN]" and replace with Person Name (with anchor) *
  1707. ***************************************************************/
  1708.  
  1709. CheckReplacement: PROCEDURE EXPOSE PersonPrefix LastNameFl LastNameVal
  1710.  PARSE ARG line "[" last
  1711.  if last = "" then return line
  1712.  RIRN = GetaRIRN(last || ".")
  1713.  if RIRN = 0 then return line || "[" || last
  1714.  last = CheckForReplacement(last)
  1715.  lastend = GetaEnd(last || ".")
  1716.  'GETLASTNAME' RIRN
  1717.  RIRNLASTNAME = GetLastName(RESULT)
  1718.  'GETFIRSTNAME' RIRN
  1719.  RIRNFIRSTNAME = RESULT
  1720.  thelastname = RIRNLASTNAME
  1721.  'GETSEX' RIRN
  1722.  if translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" then
  1723.   RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1724.  else
  1725.   RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1726.  RIRNFILENAME = PersonPrefix || RIRN
  1727.  return line || '<A HREF="'RIRNFILENAME'.htm">'RIRNFULLNAME'</A>' || lastend
  1728.  
  1729. /******************************************************************
  1730. * Check for "<IRN>" and replace with Person Name (without anchor) *
  1731. ******************************************************************/
  1732.  
  1733. CheckForNAReplacement: PROCEDURE EXPOSE PersonPrefix LastNameFl LastNameVal
  1734.  PARSE ARG line "<" last
  1735.  if last = "" then return CheckNAReplacement(line)
  1736. /* if last = "" then return line */
  1737.  RIRN = GetRIRN(last || ".")
  1738.  if RIRN = 0 then return line || "<" || last
  1739.  last = CheckForNAReplacement(last)
  1740.  lastend = GetEnd(last || ".")
  1741.  'GETLASTNAME' RIRN
  1742.  RIRNLASTNAME = GetLastName(RESULT)
  1743.  'GETFIRSTNAME' RIRN
  1744.  RIRNFIRSTNAME = RESULT
  1745.  thelastname = RIRNLASTNAME
  1746.  'GETSEX' RIRN
  1747.  GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1748.  thegender = GENDER
  1749.  if LastNameFl = -1 & RIRNLASTNAME = LastNameVal then do
  1750.   if thegender = "m" then
  1751.    RIRNFULLNAME = '' || RIRNFIRSTNAME || ''
  1752.   else
  1753.    RIRNFULLNAME = '' || RIRNFIRSTNAME || ''
  1754.   return line || RIRNFULLNAME lastend
  1755.   end
  1756.  else do
  1757.   if thegender = "m" then
  1758.    RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1759.   else
  1760.    RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1761.   return line || RIRNFULLNAME lastend
  1762.   end
  1763.  
  1764. /******************************************************************
  1765. * Check for "[IRN]" and replace with Person Name (without anchor) *
  1766. ******************************************************************/
  1767.  
  1768. CheckNAReplacement: PROCEDURE EXPOSE PersonPrefix LastNameFl LastNameVal
  1769.  PARSE ARG line "[" last
  1770.  if last = "" then return line
  1771.  RIRN = GetaRIRN(last || ".")
  1772.  if RIRN = 0 then return line || "[" || last
  1773.  last = CheckForNAReplacement(last)
  1774.  lastend = GetaEnd(last || ".")
  1775.  'GETLASTNAME' RIRN
  1776.  RIRNLASTNAME = GetLastName(RESULT)
  1777.  'GETFIRSTNAME' RIRN
  1778.  RIRNFIRSTNAME = RESULT
  1779.  thelastname = RIRNLASTNAME
  1780.  'GETSEX' RIRN
  1781.  GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1782.  thegender = GENDER
  1783.  if LastNameFl = -1 & RIRNLASTNAME = LastNameVal then do
  1784.   if thegender = "m" then
  1785.    RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1786.   else
  1787.    RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1788.   return line || RIRNFULLNAME lastend
  1789.  
  1790. GetRIRN: PROCEDURE
  1791.  PARSE ARG numb ">" last
  1792.  if last = "" then return 0
  1793.  if IsNumeric(numb) then return numb
  1794.  return 0
  1795.  
  1796. GetaRIRN: PROCEDURE
  1797.  PARSE ARG numb "]" last
  1798.  if last = "" then return 0
  1799.  if IsNumeric(numb) then return numb
  1800.  return 0
  1801.  
  1802. GetEnd: PROCEDURE
  1803.  PARSE ARG line ">" last
  1804.  if last = "" then return substr(line,1,length(line)-1)
  1805.  return substr(last,1,length(last)-1)
  1806.  
  1807. GetaEnd: PROCEDURE
  1808.  PARSE ARG line "]" last
  1809.  if last = "" then return substr(line,1,length(line)-1)
  1810.  return substr(last,1,length(last)-1)
  1811.  
  1812. GetLength: PROCEDURE
  1813.  PARSE UPPER ARG names
  1814.  nonletters = length(compress(names, xrange('A','Z')))
  1815.  return Length(names) - nonletters * 4 / 10
  1816.  
  1817.  /* create a full name from first, last, and honorifics parts */
  1818.  
  1819. GetFullName: PROCEDURE EXPOSE thelastname
  1820.  PARSE ARG firstnames "," hon
  1821.  if hon = "" then do
  1822.   if length(firstnames) > 2 then
  1823.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  1824.     firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1825.   return firstnames thelastname
  1826.   end
  1827.  return firstnames Space(thelastname) || ","hon
  1828.  
  1829. MGetFullName: PROCEDURE EXPOSE thelastname thegender
  1830.  PARSE ARG firstnames "," hon
  1831.  gchar = "B"
  1832.  if thegender = "f" then gchar = "I"
  1833.  if hon = "" then do
  1834.   if length(firstnames) > 2 then
  1835.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  1836.     firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1837.   return "<"gchar">"firstnames thelastname"</"gchar">"
  1838.   end
  1839.  return "<"gchar">"firstnames Space(thelastname) || ","hon"</"gchar">"
  1840.  
  1841. PGetFullName: PROCEDURE EXPOSE thelastname thegender
  1842.  PARSE ARG firstnames "," hon
  1843.  schar = "1"
  1844.  uchar = "2"
  1845.  if thegender = "f" then do
  1846.   schar = "3"
  1847.   uchar = "3"
  1848.   end
  1849.  if hon = "" then do
  1850.   if length(firstnames) > 2 then
  1851.    if substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." then
  1852.     firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1853.   return ""schar"m"firstnames thelastname""uchar"m"
  1854.   end
  1855.  return ""schar"m"firstnames Space(thelastname) || ","hon""uchar"m"
  1856.  
  1857. AgeTest: PROCEDURE
  1858.  PARSE ARG DBFile, HTMFile
  1859.  if Exists(DBFile) then do
  1860.   if Exists(HTMFile) then do
  1861. Parse value StateF(DBFile) with type size blk bits DBday DBmin DBtick com
  1862. Parse value StateF(HTMFile) with type size blk bits HTMday HTMmin HTMtick com
  1863. /* Say DBFile DBday DBmin DBtick  HTMFile HTMday HTMmin HTMtick */
  1864.    if ( DBday > HTMday ) | ( DBday = HTMday & DBmin > HTMmin ) then do
  1865.     Delete(HTMFile)
  1866.     Say DBFile 'is newer; removing 'HTMFile
  1867.     return 1
  1868.     end
  1869.    else do
  1870.     Say '  ~ 'HTMFile'  ...OK... '
  1871.     return 0
  1872.     end
  1873.   return 1
  1874.   end
  1875.  return 1
  1876.  end
  1877.  
  1878. CheckPathName: PROCEDURE
  1879. PARSE ARG str
  1880. /* Check if path ends with a ":". If not, append a "/" */
  1881. lastchar = right(str,1)
  1882. if right(str,1) ~= ":" & right(str,1) ~= "/" then return str'/'
  1883. return str
  1884.  
  1885. AskExit: PROCEDURE
  1886.  SAY '                 '
  1887.  SAY '===> press RETURN to exit...'
  1888.  SAY ' '
  1889.  PULL target
  1890.  PauseExit()
  1891.  end
  1892.  
  1893. PauseExit: PROCEDURE
  1894.  SAY ' '
  1895.  SAY '    \                   /'
  1896.  SAY '     \                 / '
  1897.  SAY '                         '
  1898.  SAY '                         '
  1899.  SAY '       Scion2html.rexx   '
  1900.  SAY '                         '
  1901.  SAY '              ©          '
  1902.  SAY '                         '
  1903.  SAY '        Harold Ipolyi    '
  1904.  SAY '                         '
  1905.  SAY '                         '
  1906.  SAY '     /                 \ '
  1907.  SAY '    /                   \'
  1908.  SAY ' '
  1909.  EXIT
  1910.  end
  1911.  
  1912. CheckGfxCon: PROCEDURE
  1913. DoPictures = EXISTS("Sys:Tools/GfxCon")
  1914.  
  1915. if ~DoPictures then do
  1916.  SAY ' '
  1917.  say 'GfxCon not found in Sys:Tools - unable to include pictures'
  1918.  end
  1919. return DoPictures
  1920.  
  1921. ValidTarget: PROCEDURE
  1922.  PARSE UPPER ARG str
  1923.  tval = substr(str,1,1)
  1924.  if verify(' BCDEFGHIJKLMOPQRSUVWXYZ',tval,m) > 1 then return 0
  1925.  return 1
  1926.  
  1927.  
  1928.  
  1929.  
  1930.  
  1931.  
  1932.  /* Capitalize last name; also handle special cases! */
  1933.  /* End users may wish to customize this code */
  1934.  
  1935. GetLastName: PROCEDURE
  1936. /* to use last names as is in data base,
  1937.    uncomment the following 2 lines:       */
  1938. /* PARSE ARG str */
  1939. /* return str    */
  1940.  
  1941.  PARSE upper ARG str
  1942.  if str = "BAUER-GAUSS" then return "Bauer-Gauss"
  1943.  if ( str = "DE IPOLYI" ) | ( str = "DEIPOLYI" ) then return "deIpolyi"
  1944.  if str = "MC GRADY" then return "McGrady"
  1945.  if str = "MCFEE" then return "McFee"
  1946.  if str = "KIS RED" then return "KisRed"
  1947.  if str = "ROTH-HACKENSCHMIDT" then return "Roth-Hackenschmidt"
  1948.  if str = "SCHüCH-GLICKHFELDEN" then return "Schüch-Glickhfelden"
  1949.  if str = "VONRUDERFRUD" then return "Von Ruderfrud"
  1950.  if str = "VONHARBEN" then return "Von Harben"
  1951.  else
  1952.   DO
  1953.   spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
  1954.   end
  1955.  return substr(str,1,1)Space(spart)
  1956.